1aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org/* 2b0c97975894a5eebebf9d93147cdd941a3accb63fbarchard@google.com * Copyright 2011 The LibYuv Project Authors. All rights reserved. 3aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org * 4aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org * Use of this source code is governed by a BSD-style license 5aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org * that can be found in the LICENSE file in the root of the source 6aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org * tree. An additional intellectual property rights grant can be found 7cde587092fef0dbed2c35602f30b79e7b892e766fbarchard@google.com * in the file PATENTS. All contributing project authors may 8aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org */ 10aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org 11142f6c4ed5eaeec0176f255e64bac8d8c70b42e1fbarchard@google.com#include "libyuv/row.h" 12aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org 13fe5ff7ed5451496281697bda9cb85084c532926cfbarchard@google.com#ifdef __cplusplus 14fe5ff7ed5451496281697bda9cb85084c532926cfbarchard@google.comnamespace libyuv { 15aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.orgextern "C" { 16fe5ff7ed5451496281697bda9cb85084c532926cfbarchard@google.com#endif 17aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org 18dbe4814361fb8fcbc462bbe45a2f39360e14a982fbarchard@google.com// This module is for GCC x86 and x64. 1983a63e65a6bcbf59f7dc617d0c7275d50625884cfbarchard@google.com#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) 202d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com 219335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#if defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3) 22714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 23714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com// Constants for ARGB 24f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToY = { 25714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33, 0 26714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com}; 27714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 284e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com// JPeg full range. 29f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToYJ = { 30050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com 15, 75, 38, 0, 15, 75, 38, 0, 15, 75, 38, 0, 15, 75, 38, 0 314e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com}; 329335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#endif // defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3) 339335518f4127167ee54b0872ab715c674be06005fbarchard@google.com 349335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#if defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3) 354e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com 36f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToU = { 37b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com 112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38, 0 38b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com}; 39b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com 40f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToUJ = { 41050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com 127, -84, -43, 0, 127, -84, -43, 0, 127, -84, -43, 0, 127, -84, -43, 0 42050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com}; 43050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com 44f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToV = { 45714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com -18, -94, 112, 0, -18, -94, 112, 0, -18, -94, 112, 0, -18, -94, 112, 0, 46b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com}; 472430e04e0a262f8919f61cf1e64304c69ea94127fbarchard@google.com 48f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToVJ = { 49050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com -20, -107, 127, 0, -20, -107, 127, 0, -20, -107, 127, 0, -20, -107, 127, 0 50050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com}; 51050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com 52714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com// Constants for BGRA 53f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kBGRAToY = { 54714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 0, 33, 65, 13, 0, 33, 65, 13, 0, 33, 65, 13, 0, 33, 65, 13 55b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com}; 56b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com 57f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kBGRAToU = { 58714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 0, -38, -74, 112, 0, -38, -74, 112, 0, -38, -74, 112, 0, -38, -74, 112 59714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com}; 60228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com 61f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kBGRAToV = { 62714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 0, 112, -94, -18, 0, 112, -94, -18, 0, 112, -94, -18, 0, 112, -94, -18 63714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com}; 64714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 65714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com// Constants for ABGR 66f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kABGRToY = { 67714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 33, 65, 13, 0, 33, 65, 13, 0, 33, 65, 13, 0, 33, 65, 13, 0 68714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com}; 69714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 70f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kABGRToU = { 71714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com -38, -74, 112, 0, -38, -74, 112, 0, -38, -74, 112, 0, -38, -74, 112, 0 72714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com}; 73714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 74f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kABGRToV = { 75714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 112, -94, -18, 0, 112, -94, -18, 0, 112, -94, -18, 0, 112, -94, -18, 0 76228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com}; 77228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com 784de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com// Constants for RGBA. 79f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kRGBAToY = { 804de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 0, 13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33, 0, 13, 65, 33 814de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com}; 824de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 83f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kRGBAToU = { 844de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 0, 112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38, 0, 112, -74, -38 854de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com}; 864de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 87f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kRGBAToV = { 884de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 0, -18, -94, 112, 0, -18, -94, 112, 0, -18, -94, 112, 0, -18, -94, 112 894de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com}; 904de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 91f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kAddY16 = { 92228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u 93228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com}; 94228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com 95f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec16 kAddYJ64 = { 964e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com 64, 64, 64, 64, 64, 64, 64, 64 974e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com}; 984e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com 99f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kAddUV128 = { 100714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u, 101714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u 102714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com}; 103714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 104f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec16 kAddUVJ128 = { 105050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com 0x8080u, 0x8080u, 0x8080u, 0x8080u, 0x8080u, 0x8080u, 0x8080u, 0x8080u 106050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com}; 1079335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#endif // defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_I422TOARGBROW_SSSE3) 1089335518f4127167ee54b0872ab715c674be06005fbarchard@google.com 1099335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#ifdef HAS_RGB24TOARGBROW_SSSE3 110050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com 111ba1f52692605bbf8fedb8a915275c71fa186d291fbarchard@google.com// Shuffle table for converting RGB24 to ARGB. 112f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleMaskRGB24ToARGB = { 1139394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com 0u, 1u, 2u, 12u, 3u, 4u, 5u, 13u, 6u, 7u, 8u, 14u, 9u, 10u, 11u, 15u 1149394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com}; 1159394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com 1169394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com// Shuffle table for converting RAW to ARGB. 117f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleMaskRAWToARGB = { 1189394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com 2u, 1u, 0u, 12u, 5u, 4u, 3u, 13u, 8u, 7u, 6u, 14u, 11u, 10u, 9u, 15u 1199394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com}; 1209394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com 121f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com// Shuffle table for converting ARGB to RGB24. 122f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleMaskARGBToRGB24 = { 123f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 0u, 1u, 2u, 4u, 5u, 6u, 8u, 9u, 10u, 12u, 13u, 14u, 128u, 128u, 128u, 128u 124f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com}; 125f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 126f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com// Shuffle table for converting ARGB to RAW. 127f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleMaskARGBToRAW = { 128f3fb7b692068862b1091c02b41ac48bfa9258d51fbarchard@google.com 2u, 1u, 0u, 6u, 5u, 4u, 10u, 9u, 8u, 14u, 13u, 12u, 128u, 128u, 128u, 128u 129f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com}; 130f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 1314de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com// Shuffle table for converting ARGBToRGB24 for I422ToRGB24. First 8 + next 4 132f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleMaskARGBToRGB24_0 = { 1338d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 0u, 1u, 2u, 4u, 5u, 6u, 8u, 9u, 128u, 128u, 128u, 128u, 10u, 12u, 13u, 14u 1348d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com}; 1358d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 1368d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com// Shuffle table for converting ARGB to RAW. 137f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleMaskARGBToRAW_0 = { 1388d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 2u, 1u, 0u, 6u, 5u, 4u, 10u, 9u, 128u, 128u, 128u, 128u, 8u, 14u, 13u, 12u 1398d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com}; 1409335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#endif // HAS_RGB24TOARGBROW_SSSE3 1418d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 142196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com#if defined(TESTING) && defined(__x86_64__) 143196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.comvoid TestRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix) { 144196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com asm volatile ( 145196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ".p2align 5 \n" 146196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%eax,%%eax \n" 147196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%ebx,%%ebx \n" 148196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%ecx,%%ecx \n" 149196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%edx,%%edx \n" 150196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%esi,%%esi \n" 151196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%edi,%%edi \n" 152196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%ebp,%%ebp \n" 153196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%esp,%%esp \n" 154196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ".p2align 5 \n" 155196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%r8d,%%r8d \n" 156196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%r9d,%%r9d \n" 157196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%r10d,%%r10d \n" 158196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%r11d,%%r11d \n" 159196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%r12d,%%r12d \n" 160196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%r13d,%%r13d \n" 161196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%r14d,%%r14d \n" 162196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "mov %%r15d,%%r15d \n" 163196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ".p2align 5 \n" 164196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%rax),%%eax \n" 165196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%rbx),%%ebx \n" 166196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%rcx),%%ecx \n" 167196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%rdx),%%edx \n" 168196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%rsi),%%esi \n" 169196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%rdi),%%edi \n" 170196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%rbp),%%ebp \n" 171196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%rsp),%%esp \n" 172196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ".p2align 5 \n" 173196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%r8),%%r8d \n" 174196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%r9),%%r9d \n" 175196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%r10),%%r10d \n" 176196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%r11),%%r11d \n" 177196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%r12),%%r12d \n" 178196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%r13),%%r13d \n" 179196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%r14),%%r14d \n" 180196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea (%%r15),%%r15d \n" 181196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com 182196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ".p2align 5 \n" 183196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%rax),%%eax \n" 184196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%rbx),%%ebx \n" 185196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%rcx),%%ecx \n" 186196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%rdx),%%edx \n" 187196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%rsi),%%esi \n" 188196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%rdi),%%edi \n" 189196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%rbp),%%ebp \n" 190196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%rsp),%%esp \n" 191196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ".p2align 5 \n" 192196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%r8),%%r8d \n" 193196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%r9),%%r9d \n" 194196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%r10),%%r10d \n" 195196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%r11),%%r11d \n" 196196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%r12),%%r12d \n" 197196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%r13),%%r13d \n" 198196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%r14),%%r14d \n" 199196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "lea 0x10(%%r15),%%r15d \n" 200196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com 201196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ".p2align 5 \n" 202196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%eax \n" 203196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%ebx \n" 204196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%ecx \n" 205196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%edx \n" 206196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%esi \n" 207196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%edi \n" 208196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%ebp \n" 209196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%esp \n" 210196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ".p2align 5 \n" 211196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%r8d \n" 212196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%r9d \n" 213196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%r10d \n" 214196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%r11d \n" 215196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%r12d \n" 216196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%r13d \n" 217196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%r14d \n" 218196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "add 0x10,%%r15d \n" 219196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com 220c2295807bdcfcc45d932f228f0ed3f7124005de6fbarchard@google.com ".p2align 2 \n" 221196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "1: \n" 2221b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS(0) ",%%xmm0 \n" 2231b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 2241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 2251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 226196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "sub $0x8,%2 \n" 227196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "jg 1b \n" 228196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com : "+r"(src_y), // %0 229196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "+r"(dst_argb), // %1 230196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com "+r"(pix) // %2 231196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com : 232196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com : "memory", "cc" 233196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com#if defined(__SSE2__) 234196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com , "xmm0", "xmm1", "xmm5" 235196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com#endif 236196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com ); 237196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com} 238196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com#endif // TESTING 239196cc2e5c15006db70eeb15faf3c495d260e8cd0fbarchard@google.com 2409335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#ifdef HAS_I400TOARGBROW_SSE2 241b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.comvoid I400ToARGBRow_SSE2(const uint8* src_y, uint8* dst_argb, int pix) { 242e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 243e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 244e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pslld $0x18,%%xmm5 \n" 2456f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 246e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 2471b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS(0) ",%%xmm0 \n" 2481b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 249e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpcklbw %%xmm0,%%xmm0 \n" 250e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 251e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpcklwd %%xmm0,%%xmm0 \n" 252e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpckhwd %%xmm1,%%xmm1 \n" 253e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm0 \n" 254e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm1 \n" 2551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 2561b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,1) " \n" 2571b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 258e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x8,%2 \n" 25918184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 260b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "+r"(src_y), // %0 261b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com "+r"(dst_argb), // %1 262b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com "+r"(pix) // %2 263b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : 264b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "memory", "cc" 265b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 266b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com , "xmm0", "xmm1", "xmm5" 267b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 268f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 269585a126140be298e60a4daa26140ead0e94eaaa1fbarchard@google.com} 270b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com 27100b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.comvoid I400ToARGBRow_Unaligned_SSE2(const uint8* src_y, uint8* dst_argb, 27200b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com int pix) { 27300b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com asm volatile ( 27400b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 27500b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "pslld $0x18,%%xmm5 \n" 2766f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 27700b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "1: \n" 2781b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS(0) ",%%xmm0 \n" 2791b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 28000b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "punpcklbw %%xmm0,%%xmm0 \n" 28100b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 28200b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "punpcklwd %%xmm0,%%xmm0 \n" 28300b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "punpckhwd %%xmm1,%%xmm1 \n" 28400b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "por %%xmm5,%%xmm0 \n" 28500b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "por %%xmm5,%%xmm1 \n" 2861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 2871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,1) " \n" 2881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 28900b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "sub $0x8,%2 \n" 29000b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "jg 1b \n" 29100b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com : "+r"(src_y), // %0 29200b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "+r"(dst_argb), // %1 29300b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com "+r"(pix) // %2 29400b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com : 29500b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com : "memory", "cc" 29600b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com#if defined(__SSE2__) 29700b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com , "xmm0", "xmm1", "xmm5" 29800b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com#endif 29900b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com ); 30000b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com} 3019335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#endif // HAS_I400TOARGBROW_SSE2 30200b69a2fe66183be5f72cb80c59f22e137b45359fbarchard@google.com 3039335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#ifdef HAS_RGB24TOARGBROW_SSSE3 304ba1f52692605bbf8fedb8a915275c71fa186d291fbarchard@google.comvoid RGB24ToARGBRow_SSSE3(const uint8* src_rgb24, uint8* dst_argb, int pix) { 305e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 306e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" // generate mask 0xff000000 307e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pslld $0x18,%%xmm5 \n" 308e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %3,%%xmm4 \n" 3096f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 310e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 31167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 31267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 31367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm3 \n" 31467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x30,0) ",%0 \n" 315e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm3,%%xmm2 \n" 316e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "palignr $0x8,%%xmm1,%%xmm2 \n" 317e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm4,%%xmm2 \n" 318e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm2 \n" 319e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "palignr $0xc,%%xmm0,%%xmm1 \n" 320e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm4,%%xmm0 \n" 32167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm2," MEMACCESS2(0x20,1) " \n" 322e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm0 \n" 323e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm4,%%xmm1 \n" 32467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 325e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm1 \n" 326e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "palignr $0x4,%%xmm3,%%xmm3 \n" 327e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm4,%%xmm3 \n" 32867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,1) " \n" 329e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm3 \n" 33018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 33167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm3," MEMACCESS2(0x30,1) " \n" 33267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x40,1) ",%1 \n" 33318184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 334ba1f52692605bbf8fedb8a915275c71fa186d291fbarchard@google.com : "+r"(src_rgb24), // %0 3359394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com "+r"(dst_argb), // %1 3369394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com "+r"(pix) // %2 337ba1f52692605bbf8fedb8a915275c71fa186d291fbarchard@google.com : "m"(kShuffleMaskRGB24ToARGB) // %3 338b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "memory", "cc" 339b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 340b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 341b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 342f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 343585a126140be298e60a4daa26140ead0e94eaaa1fbarchard@google.com} 344585a126140be298e60a4daa26140ead0e94eaaa1fbarchard@google.com 3459394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.comvoid RAWToARGBRow_SSSE3(const uint8* src_raw, uint8* dst_argb, int pix) { 346e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 347e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" // generate mask 0xff000000 348e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pslld $0x18,%%xmm5 \n" 349e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %3,%%xmm4 \n" 3506f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 351e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 35267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 35367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 35467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm3 \n" 35567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x30,0) ",%0 \n" 356e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm3,%%xmm2 \n" 357e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "palignr $0x8,%%xmm1,%%xmm2 \n" 358e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm4,%%xmm2 \n" 359e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm2 \n" 360e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "palignr $0xc,%%xmm0,%%xmm1 \n" 361e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm4,%%xmm0 \n" 36267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm2," MEMACCESS2(0x20,1) " \n" 363e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm0 \n" 364e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm4,%%xmm1 \n" 36567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 366e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm1 \n" 367e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "palignr $0x4,%%xmm3,%%xmm3 \n" 368e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm4,%%xmm3 \n" 36967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,1) " \n" 370e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm5,%%xmm3 \n" 37118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 37267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm3," MEMACCESS2(0x30,1) " \n" 37367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x40,1) ",%1 \n" 37418184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3759394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com : "+r"(src_raw), // %0 3769394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com "+r"(dst_argb), // %1 3779394ed99fcc9802a068ba4a44c36aed79ce87157fbarchard@google.com "+r"(pix) // %2 378b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "m"(kShuffleMaskRAWToARGB) // %3 379b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "memory", "cc" 380b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 381b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 382b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 383f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 384f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com} 385f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 386f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.comvoid RGB565ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) { 387e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 388f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "mov $0x1080108,%%eax \n" 389f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movd %%eax,%%xmm5 \n" 390f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 3916d6b7709f754391252dc716b92801cc8ec425642fbarchard@google.com "mov $0x20802080,%%eax \n" 392f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movd %%eax,%%xmm6 \n" 393f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufd $0x0,%%xmm6,%%xmm6 \n" 394f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm3,%%xmm3 \n" 395f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0xb,%%xmm3 \n" 396f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 397f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0xa,%%xmm4 \n" 398f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrlw $0x5,%%xmm4 \n" 399f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm7,%%xmm7 \n" 400f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0x8,%%xmm7 \n" 401f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub %0,%1 \n" 402f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub %0,%1 \n" 4036f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 404f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "1: \n" 40567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 406f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 407f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 408f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm3,%%xmm1 \n" 409f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0xb,%%xmm2 \n" 410f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pmulhuw %%xmm5,%%xmm1 \n" 411f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pmulhuw %%xmm5,%%xmm2 \n" 412f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0x8,%%xmm1 \n" 413f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm2,%%xmm1 \n" 414f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm4,%%xmm0 \n" 415f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pmulhuw %%xmm6,%%xmm0 \n" 416f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm7,%%xmm0 \n" 417f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm1,%%xmm2 \n" 418f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "punpcklbw %%xmm0,%%xmm1 \n" 419f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "punpckhbw %%xmm0,%%xmm2 \n" 42067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com BUNDLEALIGN 42167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movdqa,xmm1,0x00,1,0,2) // movdqa %%xmm1,(%1,%0,2) 42267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movdqa,xmm2,0x10,1,0,2) // movdqa %%xmm2,0x10(%1,%0,2) 42367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 424f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub $0x8,%2 \n" 42518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 426f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src), // %0 427f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst), // %1 428f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %2 429f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : 430f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc", "eax" 43167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 43267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 43367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 434f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#if defined(__SSE2__) 435f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 436f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#endif 437f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 438f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com} 439f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 440f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.comvoid ARGB1555ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) { 441e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 442f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "mov $0x1080108,%%eax \n" 443f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movd %%eax,%%xmm5 \n" 444f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 445f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "mov $0x42004200,%%eax \n" 446f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movd %%eax,%%xmm6 \n" 447f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufd $0x0,%%xmm6,%%xmm6 \n" 448f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm3,%%xmm3 \n" 449f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0xb,%%xmm3 \n" 450f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm3,%%xmm4 \n" 451f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrlw $0x6,%%xmm4 \n" 452f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm7,%%xmm7 \n" 453f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0x8,%%xmm7 \n" 454f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub %0,%1 \n" 455f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub %0,%1 \n" 4566f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 457f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "1: \n" 45867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 459f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 460f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 461f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0x1,%%xmm1 \n" 462f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0xb,%%xmm2 \n" 463f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm3,%%xmm1 \n" 464f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pmulhuw %%xmm5,%%xmm2 \n" 465f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pmulhuw %%xmm5,%%xmm1 \n" 466f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0x8,%%xmm1 \n" 467f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm2,%%xmm1 \n" 468f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 469f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm4,%%xmm0 \n" 470f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psraw $0x8,%%xmm2 \n" 471f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pmulhuw %%xmm6,%%xmm0 \n" 472f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm7,%%xmm2 \n" 473f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm2,%%xmm0 \n" 474f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm1,%%xmm2 \n" 475f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "punpcklbw %%xmm0,%%xmm1 \n" 476f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "punpckhbw %%xmm0,%%xmm2 \n" 47767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com BUNDLEALIGN 47867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movdqa,xmm1,0x00,1,0,2) // movdqa %%xmm1,(%1,%0,2) 47967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movdqa,xmm2,0x10,1,0,2) // movdqa %%xmm2,0x10(%1,%0,2) 48067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 481f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub $0x8,%2 \n" 48218184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 483f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src), // %0 484f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst), // %1 485f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %2 486f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : 487f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc", "eax" 48867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 48967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 49067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 491f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#if defined(__SSE2__) 492f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 493f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#endif 494f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 495f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com} 496f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 497f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.comvoid ARGB4444ToARGBRow_SSE2(const uint8* src, uint8* dst, int pix) { 498e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 499f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "mov $0xf0f0f0f,%%eax \n" 500f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movd %%eax,%%xmm4 \n" 501f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufd $0x0,%%xmm4,%%xmm4 \n" 502f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm4,%%xmm5 \n" 503f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslld $0x4,%%xmm5 \n" 504f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub %0,%1 \n" 505f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub %0,%1 \n" 5066f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 507f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "1: \n" 50867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 509f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 510f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm4,%%xmm0 \n" 511f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm5,%%xmm2 \n" 512f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 513f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm2,%%xmm3 \n" 514f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0x4,%%xmm1 \n" 515f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrlw $0x4,%%xmm3 \n" 516f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm1,%%xmm0 \n" 517f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm3,%%xmm2 \n" 518f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 519f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "punpcklbw %%xmm2,%%xmm0 \n" 520f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "punpckhbw %%xmm2,%%xmm1 \n" 52167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com BUNDLEALIGN 52267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,2) // movdqa %%xmm0,(%1,%0,2) 52367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movdqa,xmm1,0x10,1,0,2) // movdqa %%xmm1,0x10(%1,%0,2) 52467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 525f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub $0x8,%2 \n" 52618184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 527f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src), // %0 528f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst), // %1 529f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %2 530f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : 531f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc", "eax" 53267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 53367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 53467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 535f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#if defined(__SSE2__) 536f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 537f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#endif 538f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 539585a126140be298e60a4daa26140ead0e94eaaa1fbarchard@google.com} 540585a126140be298e60a4daa26140ead0e94eaaa1fbarchard@google.com 541f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.comvoid ARGBToRGB24Row_SSSE3(const uint8* src, uint8* dst, int pix) { 542e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 543f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %3,%%xmm6 \n" 5446f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 545f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "1: \n" 54667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 54767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 54867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 54967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm3 \n" 55067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 551f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufb %%xmm6,%%xmm0 \n" 552f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufb %%xmm6,%%xmm1 \n" 553f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufb %%xmm6,%%xmm2 \n" 554f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufb %%xmm6,%%xmm3 \n" 555f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm1,%%xmm4 \n" 556f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrldq $0x4,%%xmm1 \n" 557f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslldq $0xc,%%xmm4 \n" 558f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm2,%%xmm5 \n" 559f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm4,%%xmm0 \n" 560f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslldq $0x8,%%xmm5 \n" 56167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 562f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm5,%%xmm1 \n" 563f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrldq $0x8,%%xmm2 \n" 564f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslldq $0x4,%%xmm3 \n" 565f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm3,%%xmm2 \n" 56667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,1) " \n" 56767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm2," MEMACCESS2(0x20,1) " \n" 56867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x30,1) ",%1 \n" 569f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub $0x10,%2 \n" 57018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 571f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src), // %0 572f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst), // %1 573f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %2 574f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "m"(kShuffleMaskARGBToRGB24) // %3 575f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc" 576f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#if defined(__SSE2__) 577f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6" 578f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#endif 579f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 580f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com} 581f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 582f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.comvoid ARGBToRAWRow_SSSE3(const uint8* src, uint8* dst, int pix) { 583e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 584f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %3,%%xmm6 \n" 5856f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 586f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "1: \n" 58767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 58867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 58967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 59067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm3 \n" 59167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 592f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufb %%xmm6,%%xmm0 \n" 593f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufb %%xmm6,%%xmm1 \n" 594f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufb %%xmm6,%%xmm2 \n" 595f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pshufb %%xmm6,%%xmm3 \n" 596f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm1,%%xmm4 \n" 597f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrldq $0x4,%%xmm1 \n" 598f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslldq $0xc,%%xmm4 \n" 599f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm2,%%xmm5 \n" 600f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm4,%%xmm0 \n" 601f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslldq $0x8,%%xmm5 \n" 60267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 603f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm5,%%xmm1 \n" 604f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrldq $0x8,%%xmm2 \n" 605f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslldq $0x4,%%xmm3 \n" 606f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm3,%%xmm2 \n" 60767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,1) " \n" 60867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm2," MEMACCESS2(0x20,1) " \n" 60967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x30,1) ",%1 \n" 610f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub $0x10,%2 \n" 61118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 612f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src), // %0 613f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst), // %1 614f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %2 615f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "m"(kShuffleMaskARGBToRAW) // %3 616f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc" 617f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#if defined(__SSE2__) 618f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6" 619f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#endif 620f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 621f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com} 622f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 623dbcabea05708828d46162865e03324b07e70ccc7fbarchard@google.comvoid ARGBToRGB565Row_SSE2(const uint8* src, uint8* dst, int pix) { 624e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 625f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm3,%%xmm3 \n" 626f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrld $0x1b,%%xmm3 \n" 627f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 628f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrld $0x1a,%%xmm4 \n" 629f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslld $0x5,%%xmm4 \n" 630f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 631f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslld $0xb,%%xmm5 \n" 6326f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 633f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "1: \n" 63467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 635f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 636f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 637f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslld $0x8,%%xmm0 \n" 638f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrld $0x3,%%xmm1 \n" 639f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrld $0x5,%%xmm2 \n" 640f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrad $0x10,%%xmm0 \n" 641f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm3,%%xmm1 \n" 642f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm4,%%xmm2 \n" 643f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm5,%%xmm0 \n" 644f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm2,%%xmm1 \n" 645f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm1,%%xmm0 \n" 646f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "packssdw %%xmm0,%%xmm0 \n" 64767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 64867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 64967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 650f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub $0x4,%2 \n" 65118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 652f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src), // %0 653f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst), // %1 654f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %2 655f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : 656f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc" 657f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#if defined(__SSE2__) 658f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 659f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#endif 660f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 661f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com} 662f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 663f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.comvoid ARGBToARGB1555Row_SSE2(const uint8* src, uint8* dst, int pix) { 664e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 665f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 666f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrld $0x1b,%%xmm4 \n" 667f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm4,%%xmm5 \n" 668f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslld $0x5,%%xmm5 \n" 669f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm4,%%xmm6 \n" 670f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslld $0xa,%%xmm6 \n" 671f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm7,%%xmm7 \n" 672f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pslld $0xf,%%xmm7 \n" 6736f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 674f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "1: \n" 67567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 676f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 677f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 678f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm3 \n" 679f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrad $0x10,%%xmm0 \n" 680f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrld $0x3,%%xmm1 \n" 681f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrld $0x6,%%xmm2 \n" 682f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrld $0x9,%%xmm3 \n" 683f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm7,%%xmm0 \n" 684f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm4,%%xmm1 \n" 685f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm5,%%xmm2 \n" 686f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm6,%%xmm3 \n" 687f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm1,%%xmm0 \n" 688f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm3,%%xmm2 \n" 689f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm2,%%xmm0 \n" 690f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "packssdw %%xmm0,%%xmm0 \n" 69167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 69267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 69367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMACCESS2(0x8,1) ",%1 \n" 694f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub $0x4,%2 \n" 69518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 696f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src), // %0 697f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst), // %1 698f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %2 699f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : 700f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc" 701f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#if defined(__SSE2__) 702f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 703f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#endif 704f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 705f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com} 706f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 707f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.comvoid ARGBToARGB4444Row_SSE2(const uint8* src, uint8* dst, int pix) { 708e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 709f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 710f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psllw $0xc,%%xmm4 \n" 711f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm4,%%xmm3 \n" 712f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrlw $0x8,%%xmm3 \n" 7136f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 714f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "1: \n" 71567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 716f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 717f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm3,%%xmm0 \n" 718f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "pand %%xmm4,%%xmm1 \n" 719f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrlq $0x4,%%xmm0 \n" 720f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "psrlq $0x8,%%xmm1 \n" 721f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "por %%xmm1,%%xmm0 \n" 722f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 72367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 72467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 72567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 726f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "sub $0x4,%2 \n" 72718184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 728f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src), // %0 729f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst), // %1 730f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %2 731f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : 732f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc" 733f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#if defined(__SSE2__) 734f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4" 735f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com#endif 736f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 737f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com} 7389335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#endif // HAS_RGB24TOARGBROW_SSSE3 739f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com 7409335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#ifdef HAS_ARGBTOYROW_SSSE3 741b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.comvoid ARGBToYRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) { 742e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 743e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %4,%%xmm5 \n" 744e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %3,%%xmm4 \n" 7456f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 746e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 7471b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 7481b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 7491b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 7501b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm3 \n" 751e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 752e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 753e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 754e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 7551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 756e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 757e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 758e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x7,%%xmm0 \n" 759e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x7,%%xmm2 \n" 760e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 761e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 76218184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 7631b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 7641b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 76518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 766b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "+r"(src_argb), // %0 767b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com "+r"(dst_y), // %1 768b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com "+r"(pix) // %2 769b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "m"(kARGBToY), // %3 770b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com "m"(kAddY16) // %4 771b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "memory", "cc" 772b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 773b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 774b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 775f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 776b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com} 777b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com 7789335518f4127167ee54b0872ab715c674be06005fbarchard@google.comvoid ARGBToYRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) { 779cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com asm volatile ( 7804e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com "movdqa %4,%%xmm5 \n" 7819335518f4127167ee54b0872ab715c674be06005fbarchard@google.com "movdqa %3,%%xmm4 \n" 7826f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 783cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "1: \n" 7841b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 7851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 7861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 7871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm3 \n" 788cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 789cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 790cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 791cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 7921b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 793cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 794cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 795cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "psrlw $0x7,%%xmm0 \n" 796cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "psrlw $0x7,%%xmm2 \n" 797cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 7989335518f4127167ee54b0872ab715c674be06005fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 799cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "sub $0x10,%2 \n" 8001b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 8011b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 802cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "jg 1b \n" 803cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com : "+r"(src_argb), // %0 804cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "+r"(dst_y), // %1 805cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "+r"(pix) // %2 8069335518f4127167ee54b0872ab715c674be06005fbarchard@google.com : "m"(kARGBToY), // %3 8079335518f4127167ee54b0872ab715c674be06005fbarchard@google.com "m"(kAddY16) // %4 808cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com : "memory", "cc" 809cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com#if defined(__SSE2__) 8104e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 811cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com#endif 812cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com ); 813cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com} 8149335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#endif // HAS_ARGBTOYROW_SSSE3 815cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com 8169335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#ifdef HAS_ARGBTOYJROW_SSSE3 8179335518f4127167ee54b0872ab715c674be06005fbarchard@google.comvoid ARGBToYJRow_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) { 818e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 819e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %3,%%xmm4 \n" 8209335518f4127167ee54b0872ab715c674be06005fbarchard@google.com "movdqa %4,%%xmm5 \n" 8216f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 822e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 8231b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 8241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 8251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 8261b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm3 \n" 827e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 828e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 829e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 830e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 8311b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 832e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 833e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 8349335518f4127167ee54b0872ab715c674be06005fbarchard@google.com "paddw %%xmm5,%%xmm0 \n" 8359335518f4127167ee54b0872ab715c674be06005fbarchard@google.com "paddw %%xmm5,%%xmm2 \n" 836e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x7,%%xmm0 \n" 837e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x7,%%xmm2 \n" 838e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 83918184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 8401b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 8411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 84218184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 843b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com : "+r"(src_argb), // %0 844b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com "+r"(dst_y), // %1 845b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com "+r"(pix) // %2 8469335518f4127167ee54b0872ab715c674be06005fbarchard@google.com : "m"(kARGBToYJ), // %3 8479335518f4127167ee54b0872ab715c674be06005fbarchard@google.com "m"(kAddYJ64) // %4 848b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com : "memory", "cc" 849b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com#if defined(__SSE2__) 850b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 851b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com#endif 852f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 853b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com} 854aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org 855cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.comvoid ARGBToYJRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_y, int pix) { 856cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com asm volatile ( 857cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "movdqa %3,%%xmm4 \n" 8584e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com "movdqa %4,%%xmm5 \n" 8596f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 860cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "1: \n" 8611b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 8621b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 8631b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 8641b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm3 \n" 865cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 866cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 867cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 868cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 8691b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 870cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 871cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 8724e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com "paddw %%xmm5,%%xmm0 \n" 8734e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com "paddw %%xmm5,%%xmm2 \n" 874cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "psrlw $0x7,%%xmm0 \n" 875cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "psrlw $0x7,%%xmm2 \n" 876cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 877cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "sub $0x10,%2 \n" 8781b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 8791b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 880cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "jg 1b \n" 881cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com : "+r"(src_argb), // %0 882cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "+r"(dst_y), // %1 883cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com "+r"(pix) // %2 8844e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com : "m"(kARGBToYJ), // %3 8854e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com "m"(kAddYJ64) // %4 886cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com : "memory", "cc" 887cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com#if defined(__SSE2__) 8884e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 889cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com#endif 890cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com ); 891cfaa66c04154eec91951e2596cfe55eb6f2f749efbarchard@google.com} 8929335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#endif // HAS_ARGBTOYJROW_SSSE3 8934e0d7cc2c60e8aa85954c48927c6be08ee2b9db4fbarchard@google.com 8949335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#ifdef HAS_ARGBTOUVROW_SSSE3 895714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com// TODO(fbarchard): pass xmm constants to single block of assembly. 89664ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com// fpic on GCC 4.2 for OSX runs out of GPR registers. "m" effectively takes 89764ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com// 3 registers - ebx, ebp and eax. "m" can be passed with 3 normal registers, 89864ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com// or 4 if stack frame is disabled. Doing 2 assembly blocks is a work around 899714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com// and considered unsafe. 900b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.comvoid ARGBToUVRow_SSSE3(const uint8* src_argb0, int src_stride_argb, 901b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 902e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 903e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %0,%%xmm4 \n" 904e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %1,%%xmm3 \n" 905e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %2,%%xmm5 \n" 906d93d4486eb6cefba07f4707db5cce5509dc0145dfbarchard@google.com : 907f2d84dddd2157f4d25aee1fe036b89a19786a989fbarchard@google.com : "m"(kARGBToU), // %0 908f2d84dddd2157f4d25aee1fe036b89a19786a989fbarchard@google.com "m"(kARGBToV), // %1 909f2d84dddd2157f4d25aee1fe036b89a19786a989fbarchard@google.com "m"(kAddUV128) // %2 910f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 911e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 912e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub %1,%2 \n" 9136f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 914e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 9151b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 9161b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 9171b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 9181b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm6 \n" 919607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 920607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x00,0,4,1,xmm0) // pavgb (%0,%4,1),%%xmm0 921607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x10,0,4,1,xmm1) // pavgb 0x10(%0,%4,1),%%xmm1 922607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x20,0,4,1,xmm2) // pavgb 0x20(%0,%4,1),%%xmm2 923607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x30,0,4,1,xmm6) // pavgb 0x30(%0,%4,1),%%xmm6 9241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 925e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 926e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 927e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 928e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 929e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 930e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 931e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 932e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 933e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 934e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 935e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 936e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 937e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 938e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 939e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 940e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 941e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psraw $0x8,%%xmm0 \n" 942e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psraw $0x8,%%xmm1 \n" 943e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 944e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 94518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%3 \n" 9461b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 947607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 948607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 9491b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 95018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 951b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "+r"(src_argb0), // %0 952b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com "+r"(dst_u), // %1 953b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com "+r"(dst_v), // %2 954b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com "+rm"(width) // %3 955a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_argb)) // %4 956b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com : "memory", "cc" 957607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 958607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 959607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 960b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 961d93d4486eb6cefba07f4707db5cce5509dc0145dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 962b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 963f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 964b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com} 965b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com 966050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com// TODO(fbarchard): Share code with ARGBToUVRow_SSSE3. 967050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.comvoid ARGBToUVJRow_SSSE3(const uint8* src_argb0, int src_stride_argb, 968050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 969050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com asm volatile ( 970050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %0,%%xmm4 \n" 971050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %1,%%xmm3 \n" 972050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %2,%%xmm5 \n" 973050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : 974050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : "m"(kARGBToUJ), // %0 975050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "m"(kARGBToVJ), // %1 976050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "m"(kAddUVJ128) // %2 977050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com ); 978050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com asm volatile ( 979050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "sub %1,%2 \n" 9806f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 981050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "1: \n" 9821b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 9831b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 9841b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 9851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm6 \n" 986607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 987607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x00,0,4,1,xmm0) // pavgb (%0,%4,1),%%xmm0 988607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x10,0,4,1,xmm1) // pavgb 0x10(%0,%4,1),%%xmm1 989607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x20,0,4,1,xmm2) // pavgb 0x20(%0,%4,1),%%xmm2 990607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x30,0,4,1,xmm6) // pavgb 0x30(%0,%4,1),%%xmm6 9911b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 992050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 993050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 994050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 995050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 996050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 997050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 998050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 999050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1000050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1001050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1002050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1003050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1004050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1005050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1006050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1007050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1008050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "paddw %%xmm5,%%xmm0 \n" 1009050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "paddw %%xmm5,%%xmm1 \n" 1010050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "psraw $0x8,%%xmm0 \n" 1011050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "psraw $0x8,%%xmm1 \n" 1012050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1013050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "sub $0x10,%3 \n" 10141b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1015607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1016607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 10171b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 1018050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "jg 1b \n" 1019050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : "+r"(src_argb0), // %0 1020050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "+r"(dst_u), // %1 1021050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "+r"(dst_v), // %2 1022050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "+rm"(width) // %3 1023a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_argb)) // %4 1024050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : "memory", "cc" 1025607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1026607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1027607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1028050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com#if defined(__SSE2__) 1029050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1030050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com#endif 1031050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com ); 1032050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com} 1033050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com 1034b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.comvoid ARGBToUVRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb, 1035b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 1036e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1037e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %0,%%xmm4 \n" 1038e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %1,%%xmm3 \n" 1039e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %2,%%xmm5 \n" 1040b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com : 1041b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com : "m"(kARGBToU), // %0 1042b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com "m"(kARGBToV), // %1 1043b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com "m"(kAddUV128) // %2 1044f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 1045e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1046e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub %1,%2 \n" 10476f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1048e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 10491b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 10501b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 10511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 10521b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1053607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1054607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x00,0,4,1,xmm7) // movdqu (%0,%4,1),%%xmm7 1055e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1056607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x10,0,4,1,xmm7) // movdqu 0x10(%0,%4,1),%%xmm7 1057e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm7,%%xmm1 \n" 1058607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x20,0,4,1,xmm7) // movdqu 0x20(%0,%4,1),%%xmm7 1059e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1060607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x30,0,4,1,xmm7) // movdqu 0x30(%0,%4,1),%%xmm7 1061e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm7,%%xmm6 \n" 10621b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1063e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 1064e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 1065e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 1066e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1067e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 1068e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 1069e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 1070e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1071e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1072e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1073e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1074e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1075e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1076e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1077e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1078e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1079e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1080e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psraw $0x8,%%xmm1 \n" 1081e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1082e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 108318184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%3 \n" 10841b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1085607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1086607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 10871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 108818184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1089b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com : "+r"(src_argb0), // %0 1090b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com "+r"(dst_u), // %1 1091b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com "+r"(dst_v), // %2 1092b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com "+rm"(width) // %3 1093a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_argb)) // %4 1094b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com : "memory", "cc" 1095607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1096607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1097607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1098b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com#if defined(__SSE2__) 1099b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1100b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com#endif 1101f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 1102b5b27d131adf623aa98109fe4196cd492c2d8b60fbarchard@google.com} 1103714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 1104050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.comvoid ARGBToUVJRow_Unaligned_SSSE3(const uint8* src_argb0, int src_stride_argb, 1105050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 1106050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com asm volatile ( 1107050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %0,%%xmm4 \n" 1108050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %1,%%xmm3 \n" 1109050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %2,%%xmm5 \n" 1110050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : 1111050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : "m"(kARGBToUJ), // %0 1112050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "m"(kARGBToVJ), // %1 1113050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "m"(kAddUVJ128) // %2 1114050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com ); 1115050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com asm volatile ( 1116050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "sub %1,%2 \n" 11176f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1118050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "1: \n" 11191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 11201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 11211b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 11221b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1123607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1124607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x00,0,4,1,xmm7) // movdqu (%0,%4,1),%%xmm7 1125050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1126607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x10,0,4,1,xmm7) // movdqu 0x10(%0,%4,1),%%xmm7 1127050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pavgb %%xmm7,%%xmm1 \n" 1128607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x20,0,4,1,xmm7) // movdqu 0x20(%0,%4,1),%%xmm7 1129050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1130607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x30,0,4,1,xmm7) // movdqu 0x30(%0,%4,1),%%xmm7 1131050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pavgb %%xmm7,%%xmm6 \n" 11321b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1133050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 1134050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 1135050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 1136050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1137050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 1138050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 1139050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 1140050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1141050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1142050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1143050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1144050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1145050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1146050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1147050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1148050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1149050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "paddw %%xmm5,%%xmm0 \n" 1150050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "paddw %%xmm5,%%xmm1 \n" 1151050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "psraw $0x8,%%xmm0 \n" 1152050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "psraw $0x8,%%xmm1 \n" 1153050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1154050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "sub $0x10,%3 \n" 11551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1156607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1157607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 11581b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 1159050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "jg 1b \n" 1160050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : "+r"(src_argb0), // %0 1161050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "+r"(dst_u), // %1 1162050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "+r"(dst_v), // %2 1163050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "+rm"(width) // %3 1164a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_argb)) 1165050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : "memory", "cc" 1166607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1167607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1168607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1169050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com#if defined(__SSE2__) 1170050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1171050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com#endif 1172050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com ); 1173050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com} 1174050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com 1175762c050b65e64434bace6e1537221740dac77675fbarchard@google.comvoid ARGBToUV444Row_SSSE3(const uint8* src_argb, uint8* dst_u, uint8* dst_v, 1176762c050b65e64434bace6e1537221740dac77675fbarchard@google.com int width) { 1177762c050b65e64434bace6e1537221740dac77675fbarchard@google.com asm volatile ( 1178762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "movdqa %0,%%xmm4 \n" 1179762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "movdqa %1,%%xmm3 \n" 1180762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "movdqa %2,%%xmm5 \n" 1181762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : 1182762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : "m"(kARGBToU), // %0 1183762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "m"(kARGBToV), // %1 1184762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "m"(kAddUV128) // %2 1185762c050b65e64434bace6e1537221740dac77675fbarchard@google.com ); 1186762c050b65e64434bace6e1537221740dac77675fbarchard@google.com asm volatile ( 1187762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "sub %1,%2 \n" 11886f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1189762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "1: \n" 11901b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 11911b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 11921b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 11931b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1194762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1195762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 1196762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1197762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm4,%%xmm6 \n" 1198762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 1199762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "phaddw %%xmm6,%%xmm2 \n" 1200d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1201d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "psraw $0x8,%%xmm2 \n" 1202d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "packsswb %%xmm2,%%xmm0 \n" 1203762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 1204762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "sub $0x10,%3 \n" 12051b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 12061b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 12071b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 12081b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 12091b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1210762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm3,%%xmm0 \n" 1211762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1212762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm3,%%xmm2 \n" 1213762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1214762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 1215762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "phaddw %%xmm6,%%xmm2 \n" 1216d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1217d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "psraw $0x8,%%xmm2 \n" 1218d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "packsswb %%xmm2,%%xmm0 \n" 1219762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 12201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1221607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1222607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,2,1) // movdqa %%xmm0,(%1,%2,1) 12231b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 1224762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "jg 1b \n" 1225762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : "+r"(src_argb), // %0 1226762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "+r"(dst_u), // %1 1227762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "+r"(dst_v), // %2 1228762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "+rm"(width) // %3 1229762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : 1230762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : "memory", "cc" 1231607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1232607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1233607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1234762c050b65e64434bace6e1537221740dac77675fbarchard@google.com#if defined(__SSE2__) 1235762c050b65e64434bace6e1537221740dac77675fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6" 1236762c050b65e64434bace6e1537221740dac77675fbarchard@google.com#endif 1237762c050b65e64434bace6e1537221740dac77675fbarchard@google.com ); 1238762c050b65e64434bace6e1537221740dac77675fbarchard@google.com} 1239762c050b65e64434bace6e1537221740dac77675fbarchard@google.com 1240762c050b65e64434bace6e1537221740dac77675fbarchard@google.comvoid ARGBToUV444Row_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_u, 1241762c050b65e64434bace6e1537221740dac77675fbarchard@google.com uint8* dst_v, int width) { 1242762c050b65e64434bace6e1537221740dac77675fbarchard@google.com asm volatile ( 1243762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "movdqa %0,%%xmm4 \n" 1244762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "movdqa %1,%%xmm3 \n" 1245762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "movdqa %2,%%xmm5 \n" 1246762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : 1247762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : "m"(kARGBToU), // %0 1248762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "m"(kARGBToV), // %1 1249762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "m"(kAddUV128) // %2 1250762c050b65e64434bace6e1537221740dac77675fbarchard@google.com ); 1251762c050b65e64434bace6e1537221740dac77675fbarchard@google.com asm volatile ( 1252762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "sub %1,%2 \n" 12536f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1254762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "1: \n" 12551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 12561b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 12571b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 12581b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1259762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1260762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 1261762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1262762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm4,%%xmm6 \n" 1263762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 1264762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "phaddw %%xmm6,%%xmm2 \n" 1265d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1266d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "psraw $0x8,%%xmm2 \n" 1267d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "packsswb %%xmm2,%%xmm0 \n" 1268762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 1269762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "sub $0x10,%3 \n" 12701b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 12711b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 12721b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 12731b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 12741b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1275762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm3,%%xmm0 \n" 1276762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1277762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm3,%%xmm2 \n" 1278762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1279762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 1280762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "phaddw %%xmm6,%%xmm2 \n" 1281d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1282d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "psraw $0x8,%%xmm2 \n" 1283d8b73cacbefdf3cf397a410edba1d58296844adbfbarchard@google.com "packsswb %%xmm2,%%xmm0 \n" 1284762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 12851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1286607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1287607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,2,1) // movdqu %%xmm0,(%1,%2,1) 12881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 1289762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "jg 1b \n" 1290762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : "+r"(src_argb), // %0 1291762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "+r"(dst_u), // %1 1292762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "+r"(dst_v), // %2 1293762c050b65e64434bace6e1537221740dac77675fbarchard@google.com "+rm"(width) // %3 1294762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : 1295762c050b65e64434bace6e1537221740dac77675fbarchard@google.com : "memory", "cc" 1296607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1297607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1298607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1299762c050b65e64434bace6e1537221740dac77675fbarchard@google.com#if defined(__SSE2__) 1300762c050b65e64434bace6e1537221740dac77675fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6" 1301762c050b65e64434bace6e1537221740dac77675fbarchard@google.com#endif 1302762c050b65e64434bace6e1537221740dac77675fbarchard@google.com ); 1303762c050b65e64434bace6e1537221740dac77675fbarchard@google.com} 1304762c050b65e64434bace6e1537221740dac77675fbarchard@google.com 1305bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.comvoid ARGBToUV422Row_SSSE3(const uint8* src_argb0, 1306bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 1307bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com asm volatile ( 1308bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %0,%%xmm4 \n" 1309bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %1,%%xmm3 \n" 1310bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %2,%%xmm5 \n" 1311bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : 1312bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : "m"(kARGBToU), // %0 1313bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "m"(kARGBToV), // %1 1314bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "m"(kAddUV128) // %2 1315bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com ); 1316bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com asm volatile ( 1317bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "sub %1,%2 \n" 13186f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1319bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "1: \n" 13201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 13211b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 13221b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 13231b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm6 \n" 13241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1325bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 1326bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 1327bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 1328bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1329bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 1330bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 1331bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 1332bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1333bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1334bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1335bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1336bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1337bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1338bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1339bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1340bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1341bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "psraw $0x8,%%xmm0 \n" 1342bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "psraw $0x8,%%xmm1 \n" 1343bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1344bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 1345bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "sub $0x10,%3 \n" 13461b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1347607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1348607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 13491b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 1350bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "jg 1b \n" 1351bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : "+r"(src_argb0), // %0 1352bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "+r"(dst_u), // %1 1353bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "+r"(dst_v), // %2 1354bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "+rm"(width) // %3 1355bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : 1356bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : "memory", "cc" 1357607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1358607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1359607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1360bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com#if defined(__SSE2__) 1361bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1362bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com#endif 1363bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com ); 1364bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com} 1365bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com 1366bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.comvoid ARGBToUV422Row_Unaligned_SSSE3(const uint8* src_argb0, 1367bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 1368bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com asm volatile ( 1369bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %0,%%xmm4 \n" 1370bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %1,%%xmm3 \n" 1371bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %2,%%xmm5 \n" 1372bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : 1373bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : "m"(kARGBToU), // %0 1374bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "m"(kARGBToV), // %1 1375bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "m"(kAddUV128) // %2 1376bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com ); 1377bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com asm volatile ( 1378bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "sub %1,%2 \n" 13796f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1380bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "1: \n" 13811b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 13821b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 13831b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 13841b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm6 \n" 13851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1386bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 1387bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 1388bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 1389bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1390bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 1391bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 1392bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 1393bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1394bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1395bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1396bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1397bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1398bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1399bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1400bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1401bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1402bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "psraw $0x8,%%xmm0 \n" 1403bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "psraw $0x8,%%xmm1 \n" 1404bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1405bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 1406bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "sub $0x10,%3 \n" 14071b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1408607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1409607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 14101b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 1411bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "jg 1b \n" 1412bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : "+r"(src_argb0), // %0 1413bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "+r"(dst_u), // %1 1414bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "+r"(dst_v), // %2 1415bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com "+rm"(width) // %3 1416bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : 1417bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com : "memory", "cc" 1418607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1419607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1420607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1421bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com#if defined(__SSE2__) 1422bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1423bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com#endif 1424bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com ); 1425bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com} 1426bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com 1427714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.comvoid BGRAToYRow_SSSE3(const uint8* src_bgra, uint8* dst_y, int pix) { 1428e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1429714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %4,%%xmm5 \n" 1430714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %3,%%xmm4 \n" 14316f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1432714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "1: \n" 14331b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 14341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 14351b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 14361b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm3 \n" 1437714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1438714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 1439714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1440714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 14411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1442714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 1443714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 1444714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psrlw $0x7,%%xmm0 \n" 1445714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psrlw $0x7,%%xmm2 \n" 1446714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 1447714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 144818184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 14491b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 14501b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 145118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1452714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "+r"(src_bgra), // %0 1453714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_y), // %1 1454714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(pix) // %2 1455714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "m"(kBGRAToY), // %3 1456714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kAddY16) // %4 1457714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "memory", "cc" 1458714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#if defined(__SSE2__) 1459714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 1460714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#endif 1461714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1462714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com} 1463714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 1464714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.comvoid BGRAToYRow_Unaligned_SSSE3(const uint8* src_bgra, uint8* dst_y, int pix) { 1465e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1466714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %4,%%xmm5 \n" 1467714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %3,%%xmm4 \n" 14686f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1469714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "1: \n" 14701b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 14711b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 14721b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 14731b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm3 \n" 1474714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1475714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 1476714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1477714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 14781b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1479714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 1480714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 1481714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psrlw $0x7,%%xmm0 \n" 1482714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psrlw $0x7,%%xmm2 \n" 1483714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 1484714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 148518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 14861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 14871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 148818184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1489714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "+r"(src_bgra), // %0 1490714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_y), // %1 1491714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(pix) // %2 1492714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "m"(kBGRAToY), // %3 1493714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kAddY16) // %4 1494714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "memory", "cc" 1495714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#if defined(__SSE2__) 1496714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 1497714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#endif 1498714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1499714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com} 1500714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 1501714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.comvoid BGRAToUVRow_SSSE3(const uint8* src_bgra0, int src_stride_bgra, 1502714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 1503e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1504714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %0,%%xmm4 \n" 1505714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %1,%%xmm3 \n" 1506714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %2,%%xmm5 \n" 1507714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : 1508714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "m"(kBGRAToU), // %0 1509714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kBGRAToV), // %1 1510714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kAddUV128) // %2 1511714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1512e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1513714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "sub %1,%2 \n" 15146f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1515714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "1: \n" 15161b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 15171b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 15181b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 15191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1520607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1521607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x00,0,4,1,xmm0) // pavgb (%0,%4,1),%%xmm0 1522607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x10,0,4,1,xmm1) // pavgb 0x10(%0,%4,1),%%xmm1 1523607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x20,0,4,1,xmm2) // pavgb 0x20(%0,%4,1),%%xmm2 1524607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x30,0,4,1,xmm6) // pavgb 0x30(%0,%4,1),%%xmm6 15251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1526714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 1527714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 1528714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 1529714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1530714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 1531714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 1532714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 1533714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1534714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1535714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1536714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1537714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1538714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1539714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1540714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1541714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1542714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1543714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psraw $0x8,%%xmm1 \n" 1544714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1545714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 154618184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%3 \n" 15471b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1548607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1549607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 15501b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 155118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1552714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "+r"(src_bgra0), // %0 1553714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_u), // %1 1554714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_v), // %2 1555714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+rm"(width) // %3 1556a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_bgra)) // %4 1557714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "memory", "cc" 1558607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1559607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1560607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1561714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#if defined(__SSE2__) 1562714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1563714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#endif 1564714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1565714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com} 1566714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 1567714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.comvoid BGRAToUVRow_Unaligned_SSSE3(const uint8* src_bgra0, int src_stride_bgra, 1568714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 1569e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1570714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %0,%%xmm4 \n" 1571714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %1,%%xmm3 \n" 1572714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %2,%%xmm5 \n" 1573714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : 1574714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "m"(kBGRAToU), // %0 1575714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kBGRAToV), // %1 1576714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kAddUV128) // %2 1577714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1578e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1579714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "sub %1,%2 \n" 15806f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1581714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "1: \n" 15821b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 15831b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 15841b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 15851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1586607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1587607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x00,0,4,1,xmm7) // movdqu (%0,%4,1),%%xmm7 1588714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1589607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x10,0,4,1,xmm7) // movdqu 0x10(%0,%4,1),%%xmm7 1590714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm1 \n" 1591607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x20,0,4,1,xmm7) // movdqu 0x20(%0,%4,1),%%xmm7 1592714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1593607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x30,0,4,1,xmm7) // movdqu 0x30(%0,%4,1),%%xmm7 1594714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm6 \n" 15951b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1596714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 1597714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 1598714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 1599714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1600714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 1601714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 1602714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 1603714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1604714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1605714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1606714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1607714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1608714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1609714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1610714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1611714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1612714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1613714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psraw $0x8,%%xmm1 \n" 1614714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1615714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 161618184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%3 \n" 16171b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1618607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1619607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 16201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 162118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1622714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "+r"(src_bgra0), // %0 1623714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_u), // %1 1624714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_v), // %2 1625714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+rm"(width) // %3 1626a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_bgra)) // %4 1627714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "memory", "cc" 1628607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1629607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1630607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1631714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#if defined(__SSE2__) 1632714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1633714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#endif 1634714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1635714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com} 1636714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 1637714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.comvoid ABGRToYRow_SSSE3(const uint8* src_abgr, uint8* dst_y, int pix) { 1638e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1639714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %4,%%xmm5 \n" 1640714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %3,%%xmm4 \n" 16416f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1642714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "1: \n" 16431b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 16441b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 16451b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 16461b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm3 \n" 1647714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1648714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 1649714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1650714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 16511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1652714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 1653714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 1654714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psrlw $0x7,%%xmm0 \n" 1655714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psrlw $0x7,%%xmm2 \n" 1656714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 1657714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 165818184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 16591b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 16601b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 166118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1662714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "+r"(src_abgr), // %0 1663714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_y), // %1 1664714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(pix) // %2 1665714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "m"(kABGRToY), // %3 1666714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kAddY16) // %4 1667714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "memory", "cc" 1668714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#if defined(__SSE2__) 1669714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 1670714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#endif 1671714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1672714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com} 1673714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 1674714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.comvoid ABGRToYRow_Unaligned_SSSE3(const uint8* src_abgr, uint8* dst_y, int pix) { 1675e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1676714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %4,%%xmm5 \n" 1677714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %3,%%xmm4 \n" 16786f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1679714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "1: \n" 16801b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 16811b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 16821b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 16831b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm3 \n" 1684714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1685714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 1686714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1687714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 16881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1689714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 1690714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 1691714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psrlw $0x7,%%xmm0 \n" 1692714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psrlw $0x7,%%xmm2 \n" 1693714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 1694714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 169518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 16961b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 16971b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 169818184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1699714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "+r"(src_abgr), // %0 1700714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_y), // %1 1701714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(pix) // %2 1702714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "m"(kABGRToY), // %3 1703714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kAddY16) // %4 1704714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "memory", "cc" 1705714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#if defined(__SSE2__) 1706714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 1707714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#endif 1708714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1709714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com} 1710714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 17114de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.comvoid RGBAToYRow_SSSE3(const uint8* src_rgba, uint8* dst_y, int pix) { 17124de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com asm volatile ( 17134de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %4,%%xmm5 \n" 17144de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %3,%%xmm4 \n" 17156f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 17164de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "1: \n" 17171b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 17181b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 17191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 17201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm3 \n" 17214de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 17224de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 17234de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 17244de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 17251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 17264de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 17274de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 17284de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "psrlw $0x7,%%xmm0 \n" 17294de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "psrlw $0x7,%%xmm2 \n" 17304de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 17314de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 17324de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "sub $0x10,%2 \n" 17331b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 17341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 17354de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "jg 1b \n" 17364de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "+r"(src_rgba), // %0 17374de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+r"(dst_y), // %1 17384de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+r"(pix) // %2 17394de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "m"(kRGBAToY), // %3 17404de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "m"(kAddY16) // %4 17414de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "memory", "cc" 17424de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com#if defined(__SSE2__) 17434de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 17444de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com#endif 17454de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com ); 17464de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com} 17474de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 17484de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.comvoid RGBAToYRow_Unaligned_SSSE3(const uint8* src_rgba, uint8* dst_y, int pix) { 17494de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com asm volatile ( 17504de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %4,%%xmm5 \n" 17514de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %3,%%xmm4 \n" 17526f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 17534de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "1: \n" 17541b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 17551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 17561b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 17571b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm3 \n" 17584de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 17594de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 17604de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 17614de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm3 \n" 17621b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 17634de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 17644de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "phaddw %%xmm3,%%xmm2 \n" 17654de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "psrlw $0x7,%%xmm0 \n" 17664de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "psrlw $0x7,%%xmm2 \n" 17674de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 17684de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 17694de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "sub $0x10,%2 \n" 17701b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 17711b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 17724de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "jg 1b \n" 17734de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "+r"(src_rgba), // %0 17744de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+r"(dst_y), // %1 17754de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+r"(pix) // %2 17764de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "m"(kRGBAToY), // %3 17774de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "m"(kAddY16) // %4 17784de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "memory", "cc" 17794de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com#if defined(__SSE2__) 17804de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 17814de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com#endif 17824de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com ); 17834de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com} 17844de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 1785714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.comvoid ABGRToUVRow_SSSE3(const uint8* src_abgr0, int src_stride_abgr, 1786714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 1787e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1788714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %0,%%xmm4 \n" 1789714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %1,%%xmm3 \n" 1790714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %2,%%xmm5 \n" 1791714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : 1792714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "m"(kABGRToU), // %0 1793714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kABGRToV), // %1 1794714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kAddUV128) // %2 1795714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1796e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1797714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "sub %1,%2 \n" 17986f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1799714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "1: \n" 18001b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 18011b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 18021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 18031b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1804607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1805607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x00,0,4,1,xmm0) // pavgb (%0,%4,1),%%xmm0 1806607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x10,0,4,1,xmm1) // pavgb 0x10(%0,%4,1),%%xmm1 1807607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x20,0,4,1,xmm2) // pavgb 0x20(%0,%4,1),%%xmm2 1808607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x30,0,4,1,xmm6) // pavgb 0x30(%0,%4,1),%%xmm6 18091b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1810714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 1811714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 1812714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 1813714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1814714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 1815714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 1816714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 1817714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1818714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1819714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1820714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1821714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1822714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1823714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1824714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1825714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1826714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1827714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psraw $0x8,%%xmm1 \n" 1828714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1829714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 183018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%3 \n" 18311b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1832607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1833607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 18341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 183518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1836714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "+r"(src_abgr0), // %0 1837714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_u), // %1 1838714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_v), // %2 1839714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+rm"(width) // %3 1840a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_abgr)) // %4 1841714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "memory", "cc" 1842607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1843607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1844607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1845714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#if defined(__SSE2__) 1846714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1847714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#endif 1848714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1849714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com} 1850714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com 1851714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.comvoid ABGRToUVRow_Unaligned_SSSE3(const uint8* src_abgr0, int src_stride_abgr, 1852714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 1853e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1854714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %0,%%xmm4 \n" 1855714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %1,%%xmm3 \n" 1856714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %2,%%xmm5 \n" 1857714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : 1858714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "m"(kABGRToU), // %0 1859714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kABGRToV), // %1 1860714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "m"(kAddUV128) // %2 1861714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1862e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 1863714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "sub %1,%2 \n" 18646f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 1865714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "1: \n" 18661b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 18671b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 18681b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 18691b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1870607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1871607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x00,0,4,1,xmm7) // movdqu (%0,%4,1),%%xmm7 1872714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1873607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x10,0,4,1,xmm7) // movdqu 0x10(%0,%4,1),%%xmm7 1874714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm1 \n" 1875607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x20,0,4,1,xmm7) // movdqu 0x20(%0,%4,1),%%xmm7 1876714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1877607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x30,0,4,1,xmm7) // movdqu 0x30(%0,%4,1),%%xmm7 1878714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm6 \n" 18791b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 1880714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 1881714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 1882714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 1883714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 1884714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 1885714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 1886714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 1887714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 1888714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 1889714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 1890714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 1891714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 1892714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 1893714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 1894714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 1895714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 1896714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psraw $0x8,%%xmm0 \n" 1897714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "psraw $0x8,%%xmm1 \n" 1898714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 1899714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 190018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%3 \n" 19011b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1902607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1903607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 19041b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 190518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 1906714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "+r"(src_abgr0), // %0 1907714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_u), // %1 1908714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+r"(dst_v), // %2 1909714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com "+rm"(width) // %3 1910a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_abgr)) // %4 1911714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com : "memory", "cc" 1912607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1913607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1914607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 1915714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#if defined(__SSE2__) 1916714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 1917714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com#endif 1918714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com ); 1919714050a29dea9ab6aebb54acb8f79edf9b9f337dfbarchard@google.com} 19204de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 19214de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.comvoid RGBAToUVRow_SSSE3(const uint8* src_rgba0, int src_stride_rgba, 19224de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 19234de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com asm volatile ( 19244de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %0,%%xmm4 \n" 19254de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %1,%%xmm3 \n" 19264de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %2,%%xmm5 \n" 19274de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : 19284de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "m"(kRGBAToU), // %0 19294de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "m"(kRGBAToV), // %1 19304de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "m"(kAddUV128) // %2 19314de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com ); 19324de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com asm volatile ( 19334de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "sub %1,%2 \n" 19346f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 19354de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "1: \n" 19361b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 19371b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 19381b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 19391b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm6 \n" 1940607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1941607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x00,0,4,1,xmm0) // pavgb (%0,%4,1),%%xmm0 1942607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x10,0,4,1,xmm1) // pavgb 0x10(%0,%4,1),%%xmm1 1943607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x20,0,4,1,xmm2) // pavgb 0x20(%0,%4,1),%%xmm2 1944607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(pavgb,0x30,0,4,1,xmm6) // pavgb 0x30(%0,%4,1),%%xmm6 19451b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 19464de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 19474de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 19484de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 19494de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 19504de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 19514de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 19524de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 19534de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 19544de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 19554de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 19564de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 19574de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 19584de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 19594de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 19604de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 19614de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 19624de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "psraw $0x8,%%xmm0 \n" 19634de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "psraw $0x8,%%xmm1 \n" 19644de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 19654de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 19664de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "sub $0x10,%3 \n" 19671b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 1968607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 1969607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 19701b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 19714de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "jg 1b \n" 19724de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "+r"(src_rgba0), // %0 19734de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+r"(dst_u), // %1 19744de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+r"(dst_v), // %2 19754de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+rm"(width) // %3 1976a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_rgba)) 19774de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "memory", "cc" 1978607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 1979607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 1980607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 19814de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com#if defined(__SSE2__) 19824de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 19834de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com#endif 19844de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com ); 19854de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com} 19864de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com 19874de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.comvoid RGBAToUVRow_Unaligned_SSSE3(const uint8* src_rgba0, int src_stride_rgba, 19884de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com uint8* dst_u, uint8* dst_v, int width) { 19894de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com asm volatile ( 19904de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %0,%%xmm4 \n" 19914de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %1,%%xmm3 \n" 19924de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %2,%%xmm5 \n" 19934de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : 19944de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "m"(kRGBAToU), // %0 19954de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "m"(kRGBAToV), // %1 19964de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "m"(kAddUV128) // %2 19974de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com ); 19984de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com asm volatile ( 19994de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "sub %1,%2 \n" 20006f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 20014de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "1: \n" 20021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 20031b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 20041b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x20,0) ",%%xmm2 \n" 20051b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x30,0) ",%%xmm6 \n" 2006607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 2007607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x00,0,4,1,xmm7) // movdqu (%0,%4,1),%%xmm7 20084de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 2009607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x10,0,4,1,xmm7) // movdqu 0x10(%0,%4,1),%%xmm7 20104de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pavgb %%xmm7,%%xmm1 \n" 2011607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x20,0,4,1,xmm7) // movdqu 0x20(%0,%4,1),%%xmm7 20124de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 2013607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x30,0,4,1,xmm7) // movdqu 0x30(%0,%4,1),%%xmm7 20144de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pavgb %%xmm7,%%xmm6 \n" 20151b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 20164de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %%xmm0,%%xmm7 \n" 20174de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "shufps $0x88,%%xmm1,%%xmm0 \n" 20184de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "shufps $0xdd,%%xmm1,%%xmm7 \n" 20194de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pavgb %%xmm7,%%xmm0 \n" 20204de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %%xmm2,%%xmm7 \n" 20214de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "shufps $0x88,%%xmm6,%%xmm2 \n" 20224de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "shufps $0xdd,%%xmm6,%%xmm7 \n" 20234de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pavgb %%xmm7,%%xmm2 \n" 20244de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 20254de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %%xmm2,%%xmm6 \n" 20264de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 20274de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm4,%%xmm2 \n" 20284de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 20294de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 20304de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "phaddw %%xmm2,%%xmm0 \n" 20314de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "phaddw %%xmm6,%%xmm1 \n" 20324de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "psraw $0x8,%%xmm0 \n" 20334de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "psraw $0x8,%%xmm1 \n" 20344de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "packsswb %%xmm1,%%xmm0 \n" 20354de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "paddb %%xmm5,%%xmm0 \n" 20364de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "sub $0x10,%3 \n" 20371b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movlps %%xmm0," MEMACCESS(1) " \n" 2038607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 2039607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movhps,xmm0,0x00,1,2,1) // movhps %%xmm0,(%1,%2,1) 20401b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 20414de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "jg 1b \n" 20424de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "+r"(src_rgba0), // %0 20434de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+r"(dst_u), // %1 20444de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+r"(dst_v), // %2 20454de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "+rm"(width) // %3 2046a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride_rgba)) // %4 20474de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com : "memory", "cc" 2048607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 2049607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 2050607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 20514de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com#if defined(__SSE2__) 20524de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm6", "xmm7" 20534de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com#endif 20544de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com ); 20554de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com} 20569335518f4127167ee54b0872ab715c674be06005fbarchard@google.com#endif // HAS_ARGBTOUVROW_SSSE3 2057b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com 2058e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com#ifdef HAS_I422TOARGBROW_SSSE3 2059a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com#define UB 127 /* min(63,(int8)(2.018 * 64)) */ 2060a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com#define UG -25 /* (int8)(-0.391 * 64 - 0.5) */ 2061228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com#define UR 0 2062228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com 2063228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com#define VB 0 2064a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com#define VG -52 /* (int8)(-0.813 * 64 - 0.5) */ 2065a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com#define VR 102 /* (int8)(1.596 * 64 + 0.5) */ 2066228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com 2067228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com// Bias 2068228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com#define BB UB * 128 + VB * 128 2069228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com#define BG UG * 128 + VG * 128 2070228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com#define BR UR * 128 + VR * 128 2071228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com 2072a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com#define YG 74 /* (int8)(1.164 * 64 + 0.5) */ 2073228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com 20741c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.comstruct { 20752d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec8 kUVToB; // 0 20762d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec8 kUVToG; // 16 20772d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec8 kUVToR; // 32 20782d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec16 kUVBiasB; // 48 20792d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec16 kUVBiasG; // 64 20802d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec16 kUVBiasR; // 80 20812d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec16 kYSub16; // 96 20822d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec16 kYToRgb; // 112 20832d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec8 kVUToB; // 128 20842d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec8 kVUToG; // 144 20852d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com vec8 kVUToR; // 160 2086f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.com} static SIMD_ALIGNED(kYuvConstants) = { 20871c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com { UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB }, 20881c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com { UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG }, 20891c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com { UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR }, 20901c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com { BB, BB, BB, BB, BB, BB, BB, BB }, 20911c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com { BG, BG, BG, BG, BG, BG, BG, BG }, 20921c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com { BR, BR, BR, BR, BR, BR, BR, BR }, 20931c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com { 16, 16, 16, 16, 16, 16, 16, 16 }, 20942d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com { YG, YG, YG, YG, YG, YG, YG, YG }, 20952d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com { VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB, VB, UB }, 20962d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com { VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG }, 20972d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com { VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR, VR, UR } 20981c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com}; 20991c2d8be1e1edcfe70f369184c5abcd0bd09180b9fbarchard@google.com 21002d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com 21014c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com// Read 8 UV from 411 21024c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#define READYUV444 \ 210367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq " MEMACCESS([u_buf]) ",%%xmm0 \n" \ 210467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com BUNDLEALIGN \ 2105a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com MEMOPREG(movq, 0x00, [u_buf], [v_buf], 1, xmm1) \ 2106a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "lea " MEMLEA(0x8, [u_buf]) ",%[u_buf] \n" \ 2107a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 2108e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com 21094c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com// Read 4 UV from 422, upsample to 8 UV 21104c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#define READYUV422 \ 211167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movd " MEMACCESS([u_buf]) ",%%xmm0 \n" \ 211267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com BUNDLEALIGN \ 21130287a3cb5300d4fc5d81a87aea84bba506f7b544fbarchard@google.com MEMOPREG(movd, 0x00, [u_buf], [v_buf], 1, xmm1) \ 2114a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "lea " MEMLEA(0x4, [u_buf]) ",%[u_buf] \n" \ 211567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" \ 2116a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "punpcklwd %%xmm0,%%xmm0 \n" 2117e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 21184c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com// Read 2 UV from 411, upsample to 8 UV 21194c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#define READYUV411 \ 212067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movd " MEMACCESS([u_buf]) ",%%xmm0 \n" \ 212167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com BUNDLEALIGN \ 2122a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com MEMOPREG(movd, 0x00, [u_buf], [v_buf], 1, xmm1) \ 2123a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "lea " MEMLEA(0x2, [u_buf]) ",%[u_buf] \n" \ 212467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" \ 212567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "punpcklwd %%xmm0,%%xmm0 \n" \ 2126a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "punpckldq %%xmm0,%%xmm0 \n" 21274c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com 21282d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com// Read 4 UV from NV12, upsample to 8 UV 21292d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#define READNV12 \ 213067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq " MEMACCESS([uv_buf]) ",%%xmm0 \n" \ 2131a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "lea " MEMLEA(0x8, [uv_buf]) ",%[uv_buf] \n" \ 2132a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "punpcklwd %%xmm0,%%xmm0 \n" 21332d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com 21344c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com// Convert 8 pixels: 8 UV and 8 Y 21354c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#define YUVTORGB \ 213667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" \ 213767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" \ 213867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "pmaddubsw " MEMACCESS([kYuvConstants]) ",%%xmm0 \n" \ 2139a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "pmaddubsw " MEMACCESS2(16, [kYuvConstants]) ",%%xmm1 \n" \ 2140a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "pmaddubsw " MEMACCESS2(32, [kYuvConstants]) ",%%xmm2 \n" \ 2141a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "psubw " MEMACCESS2(48, [kYuvConstants]) ",%%xmm0 \n" \ 2142a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "psubw " MEMACCESS2(64, [kYuvConstants]) ",%%xmm1 \n" \ 2143a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "psubw " MEMACCESS2(80, [kYuvConstants]) ",%%xmm2 \n" \ 214467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq " MEMACCESS([y_buf]) ",%%xmm3 \n" \ 2145a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "lea " MEMLEA(0x8, [y_buf]) ",%[y_buf] \n" \ 214667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "punpcklbw %%xmm4,%%xmm3 \n" \ 2147a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "psubsw " MEMACCESS2(96, [kYuvConstants]) ",%%xmm3 \n" \ 2148a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "pmullw " MEMACCESS2(112, [kYuvConstants]) ",%%xmm3 \n" \ 214967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "paddsw %%xmm3,%%xmm0 \n" \ 215067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "paddsw %%xmm3,%%xmm1 \n" \ 215167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "paddsw %%xmm3,%%xmm2 \n" \ 215267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "psraw $0x6,%%xmm0 \n" \ 215367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "psraw $0x6,%%xmm1 \n" \ 215467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "psraw $0x6,%%xmm2 \n" \ 215567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" \ 215667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" \ 2157a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "packuswb %%xmm2,%%xmm2 \n" 21582d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com 21592d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com// Convert 8 pixels: 8 VU and 8 Y 21602d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#define YVUTORGB \ 216167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" \ 216267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" \ 2163a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "pmaddubsw " MEMACCESS2(128, [kYuvConstants]) ",%%xmm0 \n" \ 2164a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "pmaddubsw " MEMACCESS2(144, [kYuvConstants]) ",%%xmm1 \n" \ 2165a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "pmaddubsw " MEMACCESS2(160, [kYuvConstants]) ",%%xmm2 \n" \ 2166a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "psubw " MEMACCESS2(48, [kYuvConstants]) ",%%xmm0 \n" \ 2167a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "psubw " MEMACCESS2(64, [kYuvConstants]) ",%%xmm1 \n" \ 2168a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "psubw " MEMACCESS2(80, [kYuvConstants]) ",%%xmm2 \n" \ 216967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq " MEMACCESS([y_buf]) ",%%xmm3 \n" \ 2170a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "lea " MEMLEA(0x8, [y_buf]) ",%[y_buf] \n" \ 217167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "punpcklbw %%xmm4,%%xmm3 \n" \ 2172a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "psubsw " MEMACCESS2(96, [kYuvConstants]) ",%%xmm3 \n" \ 2173a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "pmullw " MEMACCESS2(112, [kYuvConstants]) ",%%xmm3 \n" \ 217467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "paddsw %%xmm3,%%xmm0 \n" \ 217567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "paddsw %%xmm3,%%xmm1 \n" \ 217667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "paddsw %%xmm3,%%xmm2 \n" \ 217767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "psraw $0x6,%%xmm0 \n" \ 217867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "psraw $0x6,%%xmm1 \n" \ 217967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "psraw $0x6,%%xmm2 \n" \ 218067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" \ 218167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" \ 2182a77571812e2e7e7fb9e28d15ce54543ed090ff28fbarchard@google.com "packuswb %%xmm2,%%xmm2 \n" 2183e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com 2184e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I444ToARGBRow_SSSE3(const uint8* y_buf, 2185f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com const uint8* u_buf, 2186f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com const uint8* v_buf, 2187bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 2188f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com int width) { 2189e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 21902d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2191e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2192e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 21936f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2194228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com "1: \n" 21954c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV444 21964c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2197e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 2198e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 2199e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 2200e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 2201e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 220267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS([dst_argb]) " \n" 220367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,[dst_argb]) " \n" 220467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 22052d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 220618184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 22072d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 22082d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 22092d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2210c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 22112d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 22122d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2213228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com : "memory", "cc" 221467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 221567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 221667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2217b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 2218228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2219b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 2220228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com ); 2221aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org} 2222aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org 22238d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.comvoid OMITFP I422ToRGB24Row_SSSE3(const uint8* y_buf, 22248d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com const uint8* u_buf, 22258d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com const uint8* v_buf, 2226bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_rgb24, 22278d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com int width) { 22288d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com// fpic 32 bit gcc 4.2 on OSX runs out of GPR regs. 2229e24ba5cefa1b0abb3882fe6f88298eaed70b67e8fbarchard@google.com#if defined(__i386__) 22308d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com asm volatile ( 22314de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %[kShuffleMaskARGBToRGB24_0],%%xmm5 \n" 22324de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %[kShuffleMaskARGBToRGB24],%%xmm6 \n" 22334de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com :: [kShuffleMaskARGBToRGB24_0]"m"(kShuffleMaskARGBToRGB24_0), 22344de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com [kShuffleMaskARGBToRGB24]"m"(kShuffleMaskARGBToRGB24)); 22358d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 22368d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 22378d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com asm volatile ( 2238e24ba5cefa1b0abb3882fe6f88298eaed70b67e8fbarchard@google.com#if !defined(__i386__) 22394de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %[kShuffleMaskARGBToRGB24_0],%%xmm5 \n" 22404de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %[kShuffleMaskARGBToRGB24],%%xmm6 \n" 22418d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 22428d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "sub %[u_buf],%[v_buf] \n" 22438d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 22446f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 22458d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "1: \n" 22468d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com READYUV422 22478d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com YUVTORGB 22488d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 22498d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "punpcklbw %%xmm2,%%xmm2 \n" 22508d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 22518d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 22528d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 22538d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "pshufb %%xmm5,%%xmm0 \n" 22548d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "pshufb %%xmm6,%%xmm1 \n" 22558d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "palignr $0xc,%%xmm0,%%xmm1 \n" 225667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq %%xmm0," MEMACCESS([dst_rgb24]) "\n" 225767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x8,[dst_rgb24]) "\n" 225867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x18,[dst_rgb24]) ",%[dst_rgb24] \n" 22598d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "sub $0x8,%[width] \n" 22608d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "jg 1b \n" 22618d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 22628d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 22638d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2264c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_rgb24]"+r"(dst_rgb24), // %[dst_rgb24] 22658d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com [width]"+rm"(width) // %[width] 22668d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) 2267e24ba5cefa1b0abb3882fe6f88298eaed70b67e8fbarchard@google.com#if !defined(__i386__) 22684de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com , [kShuffleMaskARGBToRGB24_0]"m"(kShuffleMaskARGBToRGB24_0), 22694de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com [kShuffleMaskARGBToRGB24]"m"(kShuffleMaskARGBToRGB24) 22708d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 22718d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : "memory", "cc" 227267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 227367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 227467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 22758d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#if defined(__SSE2__) 22768d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6" 22778d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 22788d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com ); 22798d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com} 22808d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 22818d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.comvoid OMITFP I422ToRAWRow_SSSE3(const uint8* y_buf, 22828d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com const uint8* u_buf, 22838d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com const uint8* v_buf, 2284bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_raw, 22858d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com int width) { 22864de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com// fpic 32 bit gcc 4.2 on OSX runs out of GPR regs. 2287e24ba5cefa1b0abb3882fe6f88298eaed70b67e8fbarchard@google.com#if defined(__i386__) 22888d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com asm volatile ( 22894de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %[kShuffleMaskARGBToRAW_0],%%xmm5 \n" 22904de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %[kShuffleMaskARGBToRAW],%%xmm6 \n" 22914de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com :: [kShuffleMaskARGBToRAW_0]"m"(kShuffleMaskARGBToRAW_0), 22924de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com [kShuffleMaskARGBToRAW]"m"(kShuffleMaskARGBToRAW)); 22938d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 22948d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 22958d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com asm volatile ( 2296e24ba5cefa1b0abb3882fe6f88298eaed70b67e8fbarchard@google.com#if !defined(__i386__) 22974de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %[kShuffleMaskARGBToRAW_0],%%xmm5 \n" 22984de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com "movdqa %[kShuffleMaskARGBToRAW],%%xmm6 \n" 22998d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 23008d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "sub %[u_buf],%[v_buf] \n" 23018d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 23026f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 23038d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "1: \n" 23048d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com READYUV422 23058d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com YUVTORGB 23068d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 23078d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "punpcklbw %%xmm2,%%xmm2 \n" 23088d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 23098d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 23108d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 23118d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "pshufb %%xmm5,%%xmm0 \n" 23128d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "pshufb %%xmm6,%%xmm1 \n" 23138d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "palignr $0xc,%%xmm0,%%xmm1 \n" 231467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq %%xmm0," MEMACCESS([dst_raw]) " \n" 231567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x8,[dst_raw]) "\n" 231667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x18,[dst_raw]) ",%[dst_raw] \n" 23178d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "sub $0x8,%[width] \n" 23188d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "jg 1b \n" 23198d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 23208d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 23218d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2322c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_raw]"+r"(dst_raw), // %[dst_raw] 23238d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com [width]"+rm"(width) // %[width] 23248d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) 2325e24ba5cefa1b0abb3882fe6f88298eaed70b67e8fbarchard@google.com#if !defined(__i386__) 23264de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com , [kShuffleMaskARGBToRAW_0]"m"(kShuffleMaskARGBToRAW_0), 23274de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com [kShuffleMaskARGBToRAW]"m"(kShuffleMaskARGBToRAW) 23288d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 23298d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : "memory", "cc" 233067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 233167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 233267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 23338d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#if defined(__SSE2__) 23344de0c439aae9f2d40246dfebce82c18a159ebdc8fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6" 23358d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 23368d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com ); 23378d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com} 23388d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 2339e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I422ToARGBRow_SSSE3(const uint8* y_buf, 2340f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com const uint8* u_buf, 2341f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com const uint8* v_buf, 2342bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 2343dbcabea05708828d46162865e03324b07e70ccc7fbarchard@google.com int width) { 2344e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 23452d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2346e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2347e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 23486f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2349228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com "1: \n" 23504c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV422 23514c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2352e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 2353e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 2354e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 2355e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 2356e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 235767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS([dst_argb]) "\n" 235867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 235967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 23602d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 236118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 23622d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 23632d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 23642d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2365c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 23662d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 23672d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2368228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com : "memory", "cc" 236967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 237067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 237167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2372b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 2373228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2374b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 2375228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com ); 2376b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com} 2377b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com 2378e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I411ToARGBRow_SSSE3(const uint8* y_buf, 2379f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com const uint8* u_buf, 2380f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com const uint8* v_buf, 2381bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 2382f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com int width) { 2383e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 23842d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2385e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2386e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 23876f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2388228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com "1: \n" 23894c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV411 23904c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2391e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 2392e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 2393e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 2394e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 2395e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 239667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS([dst_argb]) "\n" 239767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 239867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 23992d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 24002d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "jg 1b \n" 24012d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 24022d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 24032d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2404c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 24052d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 24062d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 24072d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : "memory", "cc" 240867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 240967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 241067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 24112d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#if defined(__SSE2__) 24122d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 24132d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#endif 24142d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com ); 24152d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com} 24162d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com 24172d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.comvoid OMITFP NV12ToARGBRow_SSSE3(const uint8* y_buf, 24182d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com const uint8* uv_buf, 2419bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 24202d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com int width) { 24212d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com asm volatile ( 24222d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 24232d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 24246f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 24252d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "1: \n" 24262d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com READNV12 24272d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com YUVTORGB 24282d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 24292d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 24302d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 24312d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 24322d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 243367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS([dst_argb]) "\n" 243467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 243567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 24362d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 24372d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "jg 1b \n" 24382d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 24392d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [uv_buf]"+r"(uv_buf), // %[uv_buf] 2440c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 24412d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 24422d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 24432d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : "memory", "cc" 244467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com // Does not use r14. 24452d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#if defined(__SSE2__) 24462d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 24472d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#endif 24482d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com ); 24492d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com} 24502d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com 24512d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.comvoid OMITFP NV21ToARGBRow_SSSE3(const uint8* y_buf, 2452c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com const uint8* uv_buf, 2453bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 24542d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com int width) { 24552d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com asm volatile ( 24562d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 24572d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 24586f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 24592d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "1: \n" 24602d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com READNV12 24612d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com YVUTORGB 24622d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 24632d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 24642d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 24652d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 24662d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 246767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS([dst_argb]) "\n" 246867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 246967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 24702d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 247118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 24722d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 2473c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [uv_buf]"+r"(uv_buf), // %[uv_buf] 2474c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 24752d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 24762d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2477952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com : "memory", "cc" 247867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com // Does not use r14. 2479952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com#if defined(__SSE2__) 2480952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2481952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com#endif 2482952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com ); 2483952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com} 2484952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com 2485e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I444ToARGBRow_Unaligned_SSSE3(const uint8* y_buf, 2486952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com const uint8* u_buf, 2487952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com const uint8* v_buf, 2488bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 2489952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com int width) { 2490952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com asm volatile ( 24912d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2492952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2493952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 24946f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2495952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "1: \n" 24964c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV444 24974c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2498952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 2499952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 2500952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 2501952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 2502952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 250367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS([dst_argb]) "\n" 250467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 250567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 25062d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 2507952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "jg 1b \n" 25082d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 25092d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 25102d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2511c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 25122d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 25132d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2514952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com : "memory", "cc" 251567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 251667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 251767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2518952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com#if defined(__SSE2__) 2519952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2520952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com#endif 2521952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com ); 2522952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com} 2523952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com 2524e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I422ToARGBRow_Unaligned_SSSE3(const uint8* y_buf, 2525952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com const uint8* u_buf, 2526952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com const uint8* v_buf, 2527bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 2528952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com int width) { 2529952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com asm volatile ( 25302d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2531952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2532952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 25336f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2534952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "1: \n" 25354c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV422 25364c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2537e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 2538e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 2539e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 2540e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 2541e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 254267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS([dst_argb]) "\n" 254367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 254467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 25452d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 2546e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "jg 1b \n" 25472d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 25482d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 25492d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2550c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 25512d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 25522d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2553e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com : "memory", "cc" 255467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 255567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 255667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2557e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com#if defined(__SSE2__) 2558e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2559e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com#endif 2560e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com ); 2561e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com} 2562e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com 2563e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I411ToARGBRow_Unaligned_SSSE3(const uint8* y_buf, 2564e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* u_buf, 2565e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* v_buf, 2566bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 2567e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com int width) { 2568e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com asm volatile ( 25692d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2570e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2571e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 25726f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2573e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "1: \n" 25744c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV411 25754c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2576e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 2577e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 2578e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 2579e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 2580e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 258167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS([dst_argb]) "\n" 258267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 258367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 25842d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 25852d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "jg 1b \n" 25862d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 25872d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 25882d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2589c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 25902d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 25912d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 25922d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : "memory", "cc" 259367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 259467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 259567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 25962d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#if defined(__SSE2__) 25972d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 25982d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#endif 25992d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com ); 26002d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com} 26012d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com 26022d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.comvoid OMITFP NV12ToARGBRow_Unaligned_SSSE3(const uint8* y_buf, 26032d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com const uint8* uv_buf, 2604bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 26052d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com int width) { 26062d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com asm volatile ( 26072d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 26082d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 26096f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 26102d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "1: \n" 26112d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com READNV12 26122d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com YUVTORGB 26132d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 26142d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 26152d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 26162d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 26172d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 261867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS([dst_argb]) "\n" 261967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 262067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 26212d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 2622e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "jg 1b \n" 26232d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 26242d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [uv_buf]"+r"(uv_buf), // %[uv_buf] 2625c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 26262d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 26272d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 26282d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : "memory", "cc" 262967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com // Does not use r14. 26302d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#if defined(__SSE2__) 26312d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 26322d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com#endif 26332d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com ); 26342d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com} 26352d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com 26362d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.comvoid OMITFP NV21ToARGBRow_Unaligned_SSSE3(const uint8* y_buf, 2637c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com const uint8* uv_buf, 2638bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_argb, 26392d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com int width) { 26402d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com asm volatile ( 26412d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 26422d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 26436f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 26442d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "1: \n" 26452d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com READNV12 26462d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com YVUTORGB 26472d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 26482d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 26492d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 26502d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpcklwd %%xmm2,%%xmm0 \n" 26512d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "punpckhwd %%xmm2,%%xmm1 \n" 265267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS([dst_argb]) "\n" 265367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,[dst_argb]) "\n" 265467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_argb]) ",%[dst_argb] \n" 26552d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 26562d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "jg 1b \n" 26572d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 2658c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [uv_buf]"+r"(uv_buf), // %[uv_buf] 2659c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_argb]"+r"(dst_argb), // %[dst_argb] 26602d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 26612d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2662e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com : "memory", "cc" 266367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com // Does not use r14. 2664e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com#if defined(__SSE2__) 2665e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2666e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com#endif 2667e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com ); 2668e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com} 2669e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com 2670e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I422ToBGRARow_SSSE3(const uint8* y_buf, 2671e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* u_buf, 2672e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* v_buf, 2673bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_bgra, 2674e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com int width) { 2675e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com asm volatile ( 26762d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2677e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2678e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 26796f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2680e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "1: \n" 26814c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV422 26824c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2683952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2684952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklbw %%xmm0,%%xmm1 \n" 2685952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklbw %%xmm2,%%xmm5 \n" 2686952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "movdqa %%xmm5,%%xmm0 \n" 2687952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklwd %%xmm1,%%xmm5 \n" 2688952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpckhwd %%xmm1,%%xmm0 \n" 268967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm5," MEMACCESS([dst_bgra]) "\n" 269067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS2(0x10,[dst_bgra]) "\n" 269167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_bgra]) ",%[dst_bgra] \n" 26922d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 2693952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "jg 1b \n" 26942d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 26952d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 26962d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2697c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_bgra]"+r"(dst_bgra), // %[dst_bgra] 26982d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 26992d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2700952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com : "memory", "cc" 270167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 270267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 270367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2704952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com#if defined(__SSE2__) 2705952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2706952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com#endif 2707952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com ); 2708952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com} 2709952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com 2710e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I422ToABGRRow_SSSE3(const uint8* y_buf, 2711e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* u_buf, 2712e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* v_buf, 2713bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_abgr, 2714e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com int width) { 2715952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com asm volatile ( 27162d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2717952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2718952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 27196f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2720952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "1: \n" 27214c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV422 27224c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2723952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklbw %%xmm1,%%xmm2 \n" 2724952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 2725952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "movdqa %%xmm2,%%xmm1 \n" 2726952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpcklwd %%xmm0,%%xmm2 \n" 2727952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "punpckhwd %%xmm0,%%xmm1 \n" 272867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm2," MEMACCESS([dst_abgr]) "\n" 272967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,[dst_abgr]) "\n" 273067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_abgr]) ",%[dst_abgr] \n" 27312d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 2732952a507ca6967558c2ae773321e003b6f2bb943afbarchard@google.com "jg 1b \n" 27332d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 27342d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 27352d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2736c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_abgr]"+r"(dst_abgr), // %[dst_abgr] 27372d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 27382d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2739228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com : "memory", "cc" 274067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 274167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 274267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2743b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 2744228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2745b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 2746228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com ); 274743575c8fa5a0f18b1ad9146cda3dfb1af13811f2mikhal@webrtc.org} 274843575c8fa5a0f18b1ad9146cda3dfb1af13811f2mikhal@webrtc.org 2749e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.comvoid OMITFP I422ToRGBARow_SSSE3(const uint8* y_buf, 2750e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com const uint8* u_buf, 2751e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com const uint8* v_buf, 2752bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_rgba, 2753e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com int width) { 2754e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com asm volatile ( 2755e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2756e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2757e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 27586f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2759e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "1: \n" 2760e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com READYUV422 2761e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com YUVTORGB 2762e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2763e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "punpcklbw %%xmm2,%%xmm1 \n" 2764e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "punpcklbw %%xmm0,%%xmm5 \n" 2765e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "movdqa %%xmm5,%%xmm0 \n" 2766e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "punpcklwd %%xmm1,%%xmm5 \n" 2767e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "punpckhwd %%xmm1,%%xmm0 \n" 276867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm5," MEMACCESS([dst_rgba]) "\n" 276967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS2(0x10,[dst_rgba]) "\n" 277067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_rgba]) ",%[dst_rgba] \n" 2771e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "sub $0x8,%[width] \n" 2772e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "jg 1b \n" 2773e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 2774e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 2775e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2776c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_rgba]"+r"(dst_rgba), // %[dst_rgba] 2777e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com [width]"+rm"(width) // %[width] 2778e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2779e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com : "memory", "cc" 278067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 278167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 278267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2783e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com#if defined(__SSE2__) 2784e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2785e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com#endif 2786e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com ); 2787e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com} 2788e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com 2789e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I422ToBGRARow_Unaligned_SSSE3(const uint8* y_buf, 2790e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* u_buf, 2791e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* v_buf, 2792bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_bgra, 2793e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com int width) { 2794e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 27952d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2796e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2797e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 27986f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2799228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com "1: \n" 28004c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV422 28014c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2802e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2803e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm0,%%xmm1 \n" 2804e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm2,%%xmm5 \n" 2805e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "movdqa %%xmm5,%%xmm0 \n" 2806e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklwd %%xmm1,%%xmm5 \n" 2807e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpckhwd %%xmm1,%%xmm0 \n" 280867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm5," MEMACCESS([dst_bgra]) "\n" 280967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS2(0x10,[dst_bgra]) "\n" 281067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_bgra]) ",%[dst_bgra] \n" 28112d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 281218184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 28132d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 28142d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 28152d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2816c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_bgra]"+r"(dst_bgra), // %[dst_bgra] 28172d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 28182d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2819228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com : "memory", "cc" 282067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 282167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 282267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2823b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 2824228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2825b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 2826228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com ); 2827120d5e73104dcc5e987063e7d94119f65c70a13bmikhal@webrtc.org} 2828e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com 2829e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.comvoid OMITFP I422ToABGRRow_Unaligned_SSSE3(const uint8* y_buf, 2830e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* u_buf, 2831e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com const uint8* v_buf, 2832bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_abgr, 2833e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com int width) { 2834e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com asm volatile ( 28352d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2836e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2837e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 28386f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2839e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "1: \n" 28404c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com READYUV422 28414c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com YUVTORGB 2842e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm1,%%xmm2 \n" 2843e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 2844e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "movdqa %%xmm2,%%xmm1 \n" 2845e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpcklwd %%xmm0,%%xmm2 \n" 2846e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "punpckhwd %%xmm0,%%xmm1 \n" 284767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm2," MEMACCESS([dst_abgr]) "\n" 284867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,[dst_abgr]) "\n" 284967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_abgr]) ",%[dst_abgr] \n" 28502d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com "sub $0x8,%[width] \n" 2851e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com "jg 1b \n" 28522d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 28532d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 28542d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2855c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_abgr]"+r"(dst_abgr), // %[dst_abgr] 28562d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com [width]"+rm"(width) // %[width] 28572d9fe08225ab28f62b515b2b914accc6a7b060fbfbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2858e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com : "memory", "cc" 285967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 286067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 286167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2862e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com#if defined(__SSE2__) 2863e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2864228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com#endif 2865e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com ); 2866e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com} 2867e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com 2868e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.comvoid OMITFP I422ToRGBARow_Unaligned_SSSE3(const uint8* y_buf, 2869e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com const uint8* u_buf, 2870e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com const uint8* v_buf, 2871bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.com uint8* dst_rgba, 2872e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com int width) { 2873e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com asm volatile ( 2874e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "sub %[u_buf],%[v_buf] \n" 2875e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2876e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 28776f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2878e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "1: \n" 2879e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com READYUV422 2880e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com YUVTORGB 2881e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 2882e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "punpcklbw %%xmm2,%%xmm1 \n" 2883e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "punpcklbw %%xmm0,%%xmm5 \n" 2884e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "movdqa %%xmm5,%%xmm0 \n" 2885e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "punpcklwd %%xmm1,%%xmm5 \n" 2886e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "punpckhwd %%xmm1,%%xmm0 \n" 28870014ce0056ba7bcbdf7e7fd31825ed58c68cb68efbarchard@google.com "movdqu %%xmm5," MEMACCESS([dst_rgba]) "\n" 28880014ce0056ba7bcbdf7e7fd31825ed58c68cb68efbarchard@google.com "movdqu %%xmm0," MEMACCESS2(0x10,[dst_rgba]) "\n" 288967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,[dst_rgba]) ",%[dst_rgba] \n" 2890e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "sub $0x8,%[width] \n" 2891e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "jg 1b \n" 2892e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com : [y_buf]"+r"(y_buf), // %[y_buf] 2893e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com [u_buf]"+r"(u_buf), // %[u_buf] 2894e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com [v_buf]"+r"(v_buf), // %[v_buf] 2895c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com [dst_rgba]"+r"(dst_rgba), // %[dst_rgba] 2896e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com [width]"+rm"(width) // %[width] 2897e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com : [kYuvConstants]"r"(&kYuvConstants.kUVToB) // %[kYuvConstants] 2898e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com : "memory", "cc" 289967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 290067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 290167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 2902e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com#if defined(__SSE2__) 2903e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 2904e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com#endif 2905e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com ); 2906e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com} 2907e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com 2908e214fe3f070d47d34e3cfbf4431994f97c9e0d1bfbarchard@google.com#endif // HAS_I422TOARGBROW_SSSE3 2909120d5e73104dcc5e987063e7d94119f65c70a13bmikhal@webrtc.org 2910e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#ifdef HAS_YTOARGBROW_SSE2 2911f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.comvoid YToARGBRow_SSE2(const uint8* y_buf, 2912c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com uint8* dst_argb, 2913f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com int width) { 2914e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 291530859f75f28c2435753d33eb7a48ccab169feb6dfbarchard@google.com "pxor %%xmm5,%%xmm5 \n" 2916e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 2917e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pslld $0x18,%%xmm4 \n" 291830859f75f28c2435753d33eb7a48ccab169feb6dfbarchard@google.com "mov $0x00100010,%%eax \n" 2919e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movd %%eax,%%xmm3 \n" 2920e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufd $0x0,%%xmm3,%%xmm3 \n" 292130859f75f28c2435753d33eb7a48ccab169feb6dfbarchard@google.com "mov $0x004a004a,%%eax \n" 2922e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movd %%eax,%%xmm2 \n" 2923e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufd $0x0,%%xmm2,%%xmm2 \n" 29246f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2925228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com "1: \n" 29268b9759c4a757ee5d1f005cfececd8382c357e5fefbarchard@google.com // Step 1: Scale Y contribution to 8 G values. G = (y - 16) * 1.164 292767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq " MEMACCESS(0) ",%%xmm0 \n" 292867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 292930859f75f28c2435753d33eb7a48ccab169feb6dfbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 2930e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psubusw %%xmm3,%%xmm0 \n" 293130859f75f28c2435753d33eb7a48ccab169feb6dfbarchard@google.com "pmullw %%xmm2,%%xmm0 \n" 293230859f75f28c2435753d33eb7a48ccab169feb6dfbarchard@google.com "psrlw $6, %%xmm0 \n" 2933e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 29348b9759c4a757ee5d1f005cfececd8382c357e5fefbarchard@google.com 29358b9759c4a757ee5d1f005cfececd8382c357e5fefbarchard@google.com // Step 2: Weave into ARGB 2936e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpcklbw %%xmm0,%%xmm0 \n" 2937e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 2938e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpcklwd %%xmm0,%%xmm0 \n" 2939e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "punpckhwd %%xmm1,%%xmm1 \n" 2940e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm4,%%xmm0 \n" 2941e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm4,%%xmm1 \n" 294267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 294367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,1) " \n" 294467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 2945e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 2946e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x8,%2 \n" 294718184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 2948c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com : "+r"(y_buf), // %0 2949c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com "+r"(dst_argb), // %1 2950c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com "+rm"(width) // %2 29518b9759c4a757ee5d1f005cfececd8382c357e5fefbarchard@google.com : 29528b9759c4a757ee5d1f005cfececd8382c357e5fefbarchard@google.com : "memory", "cc", "eax" 2953b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#if defined(__SSE2__) 29548b9759c4a757ee5d1f005cfececd8382c357e5fefbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4" 2955b61497636a648c771ac55d184a80b17aca7414f5fbarchard@google.com#endif 2956228bdc24e44264baf3402124aaa6d4d81c8896f5fbarchard@google.com ); 2957120d5e73104dcc5e987063e7d94119f65c70a13bmikhal@webrtc.org} 29584c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#endif // HAS_YTOARGBROW_SSE2 2959aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org 296042831e0aae4c786e40302ac03bf5d679796b5c3ffbarchard@google.com#ifdef HAS_MIRRORROW_SSSE3 296112d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com// Shuffle table for reversing the bytes. 2962f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleMirror = { 296312d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com 15u, 14u, 13u, 12u, 11u, 10u, 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u 296412d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com}; 296512d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com 296642831e0aae4c786e40302ac03bf5d679796b5c3ffbarchard@google.comvoid MirrorRow_SSSE3(const uint8* src, uint8* dst, int width) { 2967a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com intptr_t temp_width = (intptr_t)(width); 2968e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 2969e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %3,%%xmm5 \n" 297067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(-0x10,0) ",%0 \n" 29716f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 2972373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com "1: \n" 297367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPREG(movdqa,0x00,0,2,1,xmm0) // movdqa (%0,%2),%%xmm0 2974e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufb %%xmm5,%%xmm0 \n" 2975e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x10,%2 \n" 297667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 297767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 297818184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 297912d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com : "+r"(src), // %0 298012d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com "+r"(dst), // %1 298112d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com "+r"(temp_width) // %2 298242831e0aae4c786e40302ac03bf5d679796b5c3ffbarchard@google.com : "m"(kShuffleMirror) // %3 298312d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com : "memory", "cc" 298467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 298567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 298667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 298712d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com#if defined(__SSE2__) 298812d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com , "xmm0", "xmm5" 298912d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com#endif 299012d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com ); 299112d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com} 29924c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#endif // HAS_MIRRORROW_SSSE3 299312d048335db029aa66396d2fc09be0612afe8b59fbarchard@google.com 299442831e0aae4c786e40302ac03bf5d679796b5c3ffbarchard@google.com#ifdef HAS_MIRRORROW_SSE2 299542831e0aae4c786e40302ac03bf5d679796b5c3ffbarchard@google.comvoid MirrorRow_SSE2(const uint8* src, uint8* dst, int width) { 2996a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com intptr_t temp_width = (intptr_t)(width); 2997e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 299867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(-0x10,0) ",%0 \n" 29996f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3000373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com "1: \n" 300167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPREG(movdqu,0x00,0,2,1,xmm0) // movdqu (%0,%2),%%xmm0 30022d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3003e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psllw $0x8,%%xmm0 \n" 3004e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3005e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "por %%xmm1,%%xmm0 \n" 3006e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshuflw $0x1b,%%xmm0,%%xmm0 \n" 3007e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufhw $0x1b,%%xmm0,%%xmm0 \n" 3008e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pshufd $0x4e,%%xmm0,%%xmm0 \n" 3009e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x10,%2 \n" 301067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 301167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,1)",%1 \n" 301218184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3013373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com : "+r"(src), // %0 3014373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com "+r"(dst), // %1 3015373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com "+r"(temp_width) // %2 3016373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com : 3017373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com : "memory", "cc" 301867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 301967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 302067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 3021373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com#if defined(__SSE2__) 3022373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com , "xmm0", "xmm1" 3023373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com#endif 3024373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com ); 3025373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com} 30264c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#endif // HAS_MIRRORROW_SSE2 3027373cdbdc58d6e7b7e4653840677ef01468607e84fbarchard@google.com 302816a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com#ifdef HAS_MIRRORROW_UV_SSSE3 302916a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com// Shuffle table for reversing the bytes of UV channels. 3030f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleMirrorUV = { 303116a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com 14u, 12u, 10u, 8u, 6u, 4u, 2u, 0u, 15u, 13u, 11u, 9u, 7u, 5u, 3u, 1u 303216a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com}; 3033bdf7cb591452611090922e690d5104a7d8c6b1e5fbarchard@google.comvoid MirrorUVRow_SSSE3(const uint8* src, uint8* dst_u, uint8* dst_v, 303416a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com int width) { 3035a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com intptr_t temp_width = (intptr_t)(width); 3036e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 303716a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com "movdqa %4,%%xmm1 \n" 303867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA4(-0x10,0,3,2) ",%0 \n" 303916a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com "sub %1,%2 \n" 30406f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 304116a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com "1: \n" 304267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 304367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(-0x10,0) ",%0 \n" 304416a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com "pshufb %%xmm1,%%xmm0 \n" 304516a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com "sub $8,%3 \n" 304667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movlpd %%xmm0," MEMACCESS(1) " \n" 304767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com BUNDLEALIGN 304867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movhpd,xmm0,0x00,1,2,1) // movhpd %%xmm0,(%1,%2) 304967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 305018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 305116a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com : "+r"(src), // %0 305216a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com "+r"(dst_u), // %1 305316a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com "+r"(dst_v), // %2 305416a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com "+r"(temp_width) // %3 30554d2cfd329aabe658aedc5bfb0e1e17fb21c08399fbarchard@google.com : "m"(kShuffleMirrorUV) // %4 305616a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com : "memory", "cc" 305767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 305867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 305967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 306016a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com#if defined(__SSE2__) 306116a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com , "xmm0", "xmm1" 306216a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com#endif 306316a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com ); 306416a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com} 30654c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#endif // HAS_MIRRORROW_UV_SSSE3 306616a96645b4987fddbcf726dea2fcf5dc87ca10e1fbarchard@google.com 306727d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com#ifdef HAS_ARGBMIRRORROW_SSSE3 306827d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com// Shuffle table for reversing the bytes. 3069f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kARGBShuffleMirror = { 307027d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com 12u, 13u, 14u, 15u, 8u, 9u, 10u, 11u, 4u, 5u, 6u, 7u, 0u, 1u, 2u, 3u 307127d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com}; 307227d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com 307327d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.comvoid ARGBMirrorRow_SSSE3(const uint8* src, uint8* dst, int width) { 3074a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com intptr_t temp_width = (intptr_t)(width); 307527d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com asm volatile ( 30761b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA4(-0x10,0,2,4) ",%0 \n" 307727d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com "movdqa %3,%%xmm5 \n" 30786f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 307927d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com "1: \n" 30801b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 308127d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com "pshufb %%xmm5,%%xmm0 \n" 30821b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(-0x10,0) ",%0 \n" 308327d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com "sub $0x4,%2 \n" 30841b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 30851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 308627d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com "jg 1b \n" 308727d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com : "+r"(src), // %0 308827d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com "+r"(dst), // %1 308927d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com "+r"(temp_width) // %2 30904d2cfd329aabe658aedc5bfb0e1e17fb21c08399fbarchard@google.com : "m"(kARGBShuffleMirror) // %3 309127d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com : "memory", "cc" 309227d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com#if defined(__SSE2__) 309327d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com , "xmm0", "xmm5" 309427d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com#endif 309527d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com ); 309627d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com} 309727d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com#endif // HAS_ARGBMIRRORROW_SSSE3 309827d42c7ff6452c53643bc57ee8b7b17afbe8dfd0fbarchard@google.com 3099f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com#ifdef HAS_SPLITUVROW_SSE2 3100f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.comvoid SplitUVRow_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int pix) { 3101e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 31022d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 31032d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "psrlw $0x8,%%xmm5 \n" 31042d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "sub %1,%2 \n" 31056f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 31062d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "1: \n" 310767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 310867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 310967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 31102d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 31112d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "movdqa %%xmm1,%%xmm3 \n" 31122d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "pand %%xmm5,%%xmm0 \n" 31132d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "pand %%xmm5,%%xmm1 \n" 31142d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 31152d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "psrlw $0x8,%%xmm2 \n" 31162d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "psrlw $0x8,%%xmm3 \n" 31172d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "packuswb %%xmm3,%%xmm2 \n" 311867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 311967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movdqa,xmm2,0x00,1,2,1) // movdqa %%xmm2,(%1,%2) 312067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 31212d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com "sub $0x10,%3 \n" 312218184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3123f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "+r"(src_uv), // %0 3124f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst_u), // %1 3125f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(dst_v), // %2 3126f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com "+r"(pix) // %3 3127db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com : 3128db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com : "memory", "cc" 312967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 313067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 313167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 3132db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com#if defined(__SSE2__) 3133db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 3134db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com#endif 3135db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com ); 3136db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com} 3137db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com 3138f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.comvoid SplitUVRow_Unaligned_SSE2(const uint8* src_uv, uint8* dst_u, uint8* dst_v, 3139f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com int pix) { 3140db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com asm volatile ( 3141db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3142db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3143db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "sub %1,%2 \n" 31446f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3145db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "1: \n" 314667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 314767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 314867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3149db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 3150db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "movdqa %%xmm1,%%xmm3 \n" 3151db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3152db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3153db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3154db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "psrlw $0x8,%%xmm2 \n" 3155db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "psrlw $0x8,%%xmm3 \n" 3156db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "packuswb %%xmm3,%%xmm2 \n" 315767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 315867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPMEM(movdqu,xmm2,0x00,1,2,1) // movdqu %%xmm2,(%1,%2) 315967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 3160db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "sub $0x10,%3 \n" 3161db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "jg 1b \n" 3162db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com : "+r"(src_uv), // %0 3163db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "+r"(dst_u), // %1 3164db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "+r"(dst_v), // %2 3165db694edfc2dcdede9adad7febc4e4b7f9506eee8fbarchard@google.com "+r"(pix) // %3 3166f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : 3167f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com : "memory", "cc" 316867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 316967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 317067e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 31712d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com#if defined(__SSE2__) 3172f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 31732d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com#endif 31742d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com ); 31752d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com} 3176f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com#endif // HAS_SPLITUVROW_SSE2 31772d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com 3178f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com#ifdef HAS_MERGEUVROW_SSE2 3179f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.comvoid MergeUVRow_SSE2(const uint8* src_u, const uint8* src_v, uint8* dst_uv, 3180f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com int width) { 31811dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com asm volatile ( 31821dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "sub %0,%1 \n" 31836f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 31841dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "1: \n" 318567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 318667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPREG(movdqa,0x00,0,1,1,xmm1) // movdqa (%0,%1,1),%%xmm1 318767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 31881dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 31891dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 31901dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "punpckhbw %%xmm1,%%xmm2 \n" 319167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm0," MEMACCESS(2) " \n" 319267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqa %%xmm2," MEMACCESS2(0x10,2) " \n" 319367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,2) ",%2 \n" 31941dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "sub $0x10,%3 \n" 31951dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "jg 1b \n" 31961dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com : "+r"(src_u), // %0 31971dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "+r"(src_v), // %1 31981dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "+r"(dst_uv), // %2 31991dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com "+r"(width) // %3 3200e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com : 3201e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com : "memory", "cc" 320267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 320367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 320467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 3205e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com#if defined(__SSE2__) 3206e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com , "xmm0", "xmm1", "xmm2" 3207e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com#endif 3208e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com ); 3209e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com} 3210e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com 3211f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.comvoid MergeUVRow_Unaligned_SSE2(const uint8* src_u, const uint8* src_v, 3212f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com uint8* dst_uv, int width) { 3213e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com asm volatile ( 3214e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "sub %0,%1 \n" 32156f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3216e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "1: \n" 321767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 321867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPREG(movdqu,0x00,0,1,1,xmm1) // movdqu (%0,%1,1),%%xmm1 321967e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 3220e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 3221e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "punpcklbw %%xmm1,%%xmm0 \n" 3222e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "punpckhbw %%xmm1,%%xmm2 \n" 322367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS(2) " \n" 322467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm2," MEMACCESS2(0x10,2) " \n" 322567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,2) ",%2 \n" 3226e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "sub $0x10,%3 \n" 3227e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "jg 1b \n" 3228e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com : "+r"(src_u), // %0 3229e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "+r"(src_v), // %1 3230e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "+r"(dst_uv), // %2 3231e0d8648b6ab861cfcf03513439fad8ae39ba50c2fbarchard@google.com "+r"(width) // %3 32321dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com : 32331dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com : "memory", "cc" 323467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 323567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 323667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 32371dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com#if defined(__SSE2__) 32381dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com , "xmm0", "xmm1", "xmm2" 32391dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com#endif 32401dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com ); 32411dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com} 3242f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com#endif // HAS_MERGEUVROW_SSE2 32431dafd444ba355e8188cc42c61d3ad85d6681fd1dfbarchard@google.com 324419932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com#ifdef HAS_COPYROW_SSE2 324519932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.comvoid CopyRow_SSE2(const uint8* src, uint8* dst, int count) { 3246e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 32476f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 324819932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com "1: \n" 32491b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 32501b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 32511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 32521b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 32531b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,1) " \n" 32541b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 325519932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com "sub $0x20,%2 \n" 325618184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 325719932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com : "+r"(src), // %0 325819932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com "+r"(dst), // %1 325919932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com "+r"(count) // %2 326019932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com : 326119932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com : "memory", "cc" 326219932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com#if defined(__SSE2__) 326319932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com , "xmm0", "xmm1" 326419932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com#endif 326519932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com ); 326619932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com} 326719932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com#endif // HAS_COPYROW_SSE2 326819932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com 326919932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com#ifdef HAS_COPYROW_X86 327019932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.comvoid CopyRow_X86(const uint8* src, uint8* dst, int width) { 3271a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com size_t width_tmp = (size_t)(width); 3272e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 327319932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com "shr $0x2,%2 \n" 32741b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "rep movsl " MEMMOVESTRING(0,1) " \n" 327519932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com : "+S"(src), // %0 327619932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com "+D"(dst), // %1 327719932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com "+c"(width_tmp) // %2 327819932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com : 327919932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com : "memory", "cc" 328019932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com ); 328119932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com} 32824c416e8849dcda3e884c6204bcdaa264f66d4288fbarchard@google.com#endif // HAS_COPYROW_X86 328319932f8dbc5ca3123d87b5b8369e7d7bf3469a97fbarchard@google.com 3284abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#ifdef HAS_COPYROW_ERMS 3285aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com// Unaligned Multiple of 1. 3286aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.comvoid CopyRow_ERMS(const uint8* src, uint8* dst, int width) { 3287a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com size_t width_tmp = (size_t)(width); 3288aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com asm volatile ( 32891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "rep movsb " MEMMOVESTRING(0,1) " \n" 3290aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com : "+S"(src), // %0 3291aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com "+D"(dst), // %1 3292aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com "+c"(width_tmp) // %2 3293aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com : 3294aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com : "memory", "cc" 3295aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com ); 3296aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com} 3297abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#endif // HAS_COPYROW_ERMS 3298aa7988ff733b13d7bfd3c755bf0c18f93b9e8f6efbarchard@google.com 3299fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#ifdef HAS_ARGBCOPYALPHAROW_SSE2 3300fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com// width in pixels 3301fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.comvoid ARGBCopyAlphaRow_SSE2(const uint8* src, uint8* dst, int width) { 3302fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com asm volatile ( 3303fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pcmpeqb %%xmm0,%%xmm0 \n" 3304fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pslld $0x18,%%xmm0 \n" 3305fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pcmpeqb %%xmm1,%%xmm1 \n" 3306fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "psrld $0x8,%%xmm1 \n" 33076f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3308fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "1: \n" 3309fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm2 \n" 3310fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm3 \n" 3311fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3312fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm4 \n" 3313fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa " MEMACCESS2(0x10,1) ",%%xmm5 \n" 3314fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pand %%xmm0,%%xmm2 \n" 3315fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pand %%xmm0,%%xmm3 \n" 3316fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pand %%xmm1,%%xmm4 \n" 3317fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pand %%xmm1,%%xmm5 \n" 3318fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "por %%xmm4,%%xmm2 \n" 3319fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "por %%xmm5,%%xmm3 \n" 3320fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa %%xmm2," MEMACCESS(1) " \n" 3321fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa %%xmm3," MEMACCESS2(0x10,1) " \n" 3322fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 3323fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "sub $0x8,%2 \n" 3324fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "jg 1b \n" 3325fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : "+r"(src), // %0 3326fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "+r"(dst), // %1 3327fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "+r"(width) // %2 3328fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : 3329fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : "memory", "cc" 3330fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#if defined(__SSE2__) 3331fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 3332fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#endif 3333fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com ); 3334fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com} 3335fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#endif // HAS_ARGBCOPYALPHAROW_SSE2 3336fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com 3337fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#ifdef HAS_ARGBCOPYALPHAROW_AVX2 3338fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com// width in pixels 3339fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.comvoid ARGBCopyAlphaRow_AVX2(const uint8* src, uint8* dst, int width) { 3340fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com asm volatile ( 3341fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpcmpeqb %%ymm0,%%ymm0,%%ymm0 \n" 3342fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpsrld $0x8,%%ymm0,%%ymm0 \n" 33436f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3344fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "1: \n" 3345fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vmovdqu " MEMACCESS(0) ",%%ymm1 \n" 3346fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vmovdqu " MEMACCESS2(0x20,0) ",%%ymm2 \n" 3347fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 3348fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpblendvb %%ymm0," MEMACCESS(1) ",%%ymm1,%%ymm1 \n" 3349fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpblendvb %%ymm0," MEMACCESS2(0x20,1) ",%%ymm2,%%ymm2 \n" 3350fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vmovdqu %%ymm1," MEMACCESS(1) " \n" 3351fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vmovdqu %%ymm2," MEMACCESS2(0x20,1) " \n" 3352fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "lea " MEMLEA(0x40,1) ",%1 \n" 3353fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "sub $0x10,%2 \n" 3354fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "jg 1b \n" 3355fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vzeroupper \n" 3356fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : "+r"(src), // %0 3357fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "+r"(dst), // %1 3358fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "+r"(width) // %2 3359fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : 3360fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : "memory", "cc" 3361fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#if defined(__SSE2__) 3362fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com , "xmm0", "xmm1", "xmm2" 3363fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#endif 3364fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com ); 3365fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com} 3366fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#endif // HAS_ARGBCOPYALPHAROW_AVX2 3367fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com 3368fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#ifdef HAS_ARGBCOPYYTOALPHAROW_SSE2 3369fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com// width in pixels 3370fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.comvoid ARGBCopyYToAlphaRow_SSE2(const uint8* src, uint8* dst, int width) { 3371fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com asm volatile ( 3372fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pcmpeqb %%xmm0,%%xmm0 \n" 3373fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pslld $0x18,%%xmm0 \n" 3374fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pcmpeqb %%xmm1,%%xmm1 \n" 3375fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "psrld $0x8,%%xmm1 \n" 33766f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3377fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "1: \n" 3378fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movq " MEMACCESS(0) ",%%xmm2 \n" 3379fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 3380fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "punpcklbw %%xmm2,%%xmm2 \n" 3381fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "punpckhwd %%xmm2,%%xmm3 \n" 3382fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "punpcklwd %%xmm2,%%xmm2 \n" 3383fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm4 \n" 3384fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa " MEMACCESS2(0x10,1) ",%%xmm5 \n" 3385fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pand %%xmm0,%%xmm2 \n" 3386fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pand %%xmm0,%%xmm3 \n" 3387fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pand %%xmm1,%%xmm4 \n" 3388fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "pand %%xmm1,%%xmm5 \n" 3389fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "por %%xmm4,%%xmm2 \n" 3390fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "por %%xmm5,%%xmm3 \n" 3391fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa %%xmm2," MEMACCESS(1) " \n" 3392fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "movdqa %%xmm3," MEMACCESS2(0x10,1) " \n" 3393fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 3394fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "sub $0x8,%2 \n" 3395fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "jg 1b \n" 3396fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : "+r"(src), // %0 3397fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "+r"(dst), // %1 3398fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "+r"(width) // %2 3399fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : 3400fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : "memory", "cc" 3401fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#if defined(__SSE2__) 3402fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 3403fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#endif 3404fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com ); 3405fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com} 3406fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#endif // HAS_ARGBCOPYYTOALPHAROW_SSE2 3407fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com 3408fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#ifdef HAS_ARGBCOPYYTOALPHAROW_AVX2 3409fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com// width in pixels 3410fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.comvoid ARGBCopyYToAlphaRow_AVX2(const uint8* src, uint8* dst, int width) { 3411fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com asm volatile ( 3412fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpcmpeqb %%ymm0,%%ymm0,%%ymm0 \n" 3413fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpsrld $0x8,%%ymm0,%%ymm0 \n" 34146f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3415fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "1: \n" 3416fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpmovzxbd " MEMACCESS(0) ",%%ymm1 \n" 3417fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpmovzxbd " MEMACCESS2(0x8,0) ",%%ymm2 \n" 3418fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 3419fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpslld $0x18,%%ymm1,%%ymm1 \n" 3420fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpslld $0x18,%%ymm2,%%ymm2 \n" 3421fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpblendvb %%ymm0," MEMACCESS(1) ",%%ymm1,%%ymm1 \n" 3422fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vpblendvb %%ymm0," MEMACCESS2(0x20,1) ",%%ymm2,%%ymm2 \n" 3423fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vmovdqu %%ymm1," MEMACCESS(1) " \n" 3424fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vmovdqu %%ymm2," MEMACCESS2(0x20,1) " \n" 3425fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "lea " MEMLEA(0x40,1) ",%1 \n" 3426fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "sub $0x10,%2 \n" 3427fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "jg 1b \n" 3428fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "vzeroupper \n" 3429fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : "+r"(src), // %0 3430fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "+r"(dst), // %1 3431fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com "+r"(width) // %2 3432fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : 3433fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com : "memory", "cc" 3434fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#if defined(__SSE2__) 3435fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com , "xmm0", "xmm1", "xmm2" 3436fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#endif 3437fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com ); 3438fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com} 3439fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com#endif // HAS_ARGBCOPYYTOALPHAROW_AVX2 3440fb99c030088a3d778b59f77b1950af2e00f53180fbarchard@google.com 344164ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com#ifdef HAS_SETROW_X86 3442f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.comvoid SetRow_X86(uint8* dst, uint32 v32, int width) { 3443a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com size_t width_tmp = (size_t)(width); 344464ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com asm volatile ( 344564ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com "shr $0x2,%1 \n" 34461b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "rep stosl " MEMSTORESTRING(eax,0) " \n" 344764ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com : "+D"(dst), // %0 344864ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com "+c"(width_tmp) // %1 344964ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com : "a"(v32) // %2 345064ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com : "memory", "cc"); 345164ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com} 345264ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com 3453f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.comvoid ARGBSetRows_X86(uint8* dst, uint32 v32, int width, 345464ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com int dst_stride, int height) { 345564ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com for (int y = 0; y < height; ++y) { 3456a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com size_t width_tmp = (size_t)(width); 3457a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com uint32* d = (uint32*)(dst); 345864ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com asm volatile ( 34591b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "rep stosl " MEMSTORESTRING(eax,0) " \n" 346064ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com : "+D"(d), // %0 346164ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com "+c"(width_tmp) // %1 346264ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com : "a"(v32) // %2 346364ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com : "memory", "cc"); 346464ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com dst += dst_stride; 346564ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com } 346664ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com} 346764ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com#endif // HAS_SETROW_X86 346864ce0ab544591b1e26ae6d276932cacdb8137071fbarchard@google.com 3469b95dbf24951d8b7118f680d75c7456a5f5d57bfffbarchard@google.com#ifdef HAS_YUY2TOYROW_SSE2 3470e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.comvoid YUY2ToYRow_SSE2(const uint8* src_yuy2, uint8* dst_y, int pix) { 3471e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 3472e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3473e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm5 \n" 34746f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3475e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 34761b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 34771b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 34781b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3479e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3480e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3481e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 34821b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 34831b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 3484e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x10,%2 \n" 348518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3486e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "+r"(src_yuy2), // %0 3487e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(dst_y), // %1 3488e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(pix) // %2 3489e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : 3490e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "memory", "cc" 3491e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#if defined(__SSE2__) 3492e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com , "xmm0", "xmm1", "xmm5" 3493e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#endif 3494e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com ); 3495e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com} 3496e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 3497e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.comvoid YUY2ToUVRow_SSE2(const uint8* src_yuy2, int stride_yuy2, 3498c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com uint8* dst_u, uint8* dst_v, int pix) { 3499e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 3500e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3501e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3502e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub %1,%2 \n" 35036f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3504e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 35051b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 35061b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 3507607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3508607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqa,0x00,0,4,1,xmm2) // movdqa (%0,%4,1),%%xmm2 3509607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqa,0x10,0,4,1,xmm3) // movdqa 0x10(%0,%4,1),%%xmm3 35101b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3511e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm2,%%xmm0 \n" 3512e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm3,%%xmm1 \n" 3513e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm0 \n" 3514e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3515e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3516e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3517e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3518e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 3519e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3520e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 35211b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 3522607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3523607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movq,xmm1,0x00,1,2,1) // movq %%xmm1,(%1,%2) 35241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 3525e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x10,%3 \n" 352618184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3527e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "+r"(src_yuy2), // %0 3528e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(dst_u), // %1 3529c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_v), // %2 3530e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(pix) // %3 3531a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(stride_yuy2)) // %4 3532e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "memory", "cc" 3533607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 3534607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 3535607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 3536e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#if defined(__SSE2__) 3537e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 3538e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#endif 3539e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com ); 3540e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com} 3541e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 3542c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.comvoid YUY2ToUV422Row_SSE2(const uint8* src_yuy2, 3543c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com uint8* dst_u, uint8* dst_v, int pix) { 3544c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com asm volatile ( 3545c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3546c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3547c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "sub %1,%2 \n" 35486f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3549c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "1: \n" 35501b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 35511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 35521b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3553c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm0 \n" 3554c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3555c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3556c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3557c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3558c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 3559c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3560c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 35611b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 3562607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3563607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movq,xmm1,0x00,1,2,1) // movq %%xmm1,(%1,%2) 35641b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 3565c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "sub $0x10,%3 \n" 3566c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "jg 1b \n" 3567c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : "+r"(src_yuy2), // %0 3568c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_u), // %1 3569c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_v), // %2 3570c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(pix) // %3 3571c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : 3572c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : "memory", "cc" 3573607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 3574607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 3575607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 3576c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com#if defined(__SSE2__) 3577c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com , "xmm0", "xmm1", "xmm5" 3578c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com#endif 3579c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com ); 3580c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com} 3581f3fb7b692068862b1091c02b41ac48bfa9258d51fbarchard@google.com 3582e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.comvoid YUY2ToYRow_Unaligned_SSE2(const uint8* src_yuy2, 3583e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com uint8* dst_y, int pix) { 3584e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 3585e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3586e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm5 \n" 35876f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3588e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 35891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 35901b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 35911b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3592e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3593e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3594e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 359518184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 35961b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 35971b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 359818184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3599e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "+r"(src_yuy2), // %0 3600e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(dst_y), // %1 3601e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(pix) // %2 3602e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : 3603e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "memory", "cc" 3604e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#if defined(__SSE2__) 3605e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com , "xmm0", "xmm1", "xmm5" 3606e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#endif 3607e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com ); 3608e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com} 3609e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 3610e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.comvoid YUY2ToUVRow_Unaligned_SSE2(const uint8* src_yuy2, 3611e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com int stride_yuy2, 3612d4164fb01a15022740c99f68bbf153ecc7e97b21fbarchard@google.com uint8* dst_u, uint8* dst_v, int pix) { 3613e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 3614e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3615e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3616e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub %1,%2 \n" 36176f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3618e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 36191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 36201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 3621607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3622607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x00,0,4,1,xmm2) // movdqu (%0,%4,1),%%xmm2 3623607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x10,0,4,1,xmm3) // movdqu 0x10(%0,%4,1),%%xmm3 36241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3625e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm2,%%xmm0 \n" 3626e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm3,%%xmm1 \n" 3627e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm0 \n" 3628e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3629e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3630e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3631e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3632e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 3633e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3634e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 36351b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 3636607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3637607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movq,xmm1,0x00,1,2,1) // movq %%xmm1,(%1,%2) 36381b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 3639e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x10,%3 \n" 364018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3641e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "+r"(src_yuy2), // %0 3642e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(dst_u), // %1 3643c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_v), // %2 3644e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(pix) // %3 3645a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(stride_yuy2)) // %4 3646e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "memory", "cc" 3647607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 3648607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 3649607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 3650e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#if defined(__SSE2__) 3651e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 3652e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#endif 3653f1b6063f50ced6f1b5f9b735011b382a5c1c963ffbarchard@google.com ); 3654e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com} 3655e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 3656c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.comvoid YUY2ToUV422Row_Unaligned_SSE2(const uint8* src_yuy2, 3657c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com uint8* dst_u, uint8* dst_v, int pix) { 3658c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com asm volatile ( 3659c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3660c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3661c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "sub %1,%2 \n" 36626f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3663c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "1: \n" 36641b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 36651b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 36661b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3667c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm0 \n" 3668c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3669c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3670c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3671c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3672c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 3673c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3674c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 36751b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 3676607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3677607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movq,xmm1,0x00,1,2,1) // movq %%xmm1,(%1,%2) 36781b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 3679c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "sub $0x10,%3 \n" 3680c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "jg 1b \n" 3681c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : "+r"(src_yuy2), // %0 3682c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_u), // %1 3683c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_v), // %2 3684c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(pix) // %3 3685c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : 3686c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : "memory", "cc" 3687607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 3688607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 3689607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 3690c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com#if defined(__SSE2__) 3691c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com , "xmm0", "xmm1", "xmm5" 3692c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com#endif 3693c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com ); 3694c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com} 3695c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com 3696e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.comvoid UYVYToYRow_SSE2(const uint8* src_uyvy, uint8* dst_y, int pix) { 3697e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 36986f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3699e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 37001b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 37011b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 37021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3703e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm0 \n" 3704e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3705e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 370618184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 37071b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 37081b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 370918184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3710e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "+r"(src_uyvy), // %0 3711e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(dst_y), // %1 3712e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(pix) // %2 3713e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : 3714e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "memory", "cc" 3715e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#if defined(__SSE2__) 3716e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com , "xmm0", "xmm1" 3717e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#endif 3718e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com ); 3719e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com} 3720e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 3721e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.comvoid UYVYToUVRow_SSE2(const uint8* src_uyvy, int stride_uyvy, 3722c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com uint8* dst_u, uint8* dst_v, int pix) { 3723e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 3724e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3725e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3726e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub %1,%2 \n" 37276f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3728e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 37291b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 37301b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 3731607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3732607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqa,0x00,0,4,1,xmm2) // movdqa (%0,%4,1),%%xmm2 3733607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqa,0x10,0,4,1,xmm3) // movdqa 0x10(%0,%4,1),%%xmm3 37341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3735e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm2,%%xmm0 \n" 3736e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm3,%%xmm1 \n" 3737e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3738e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3739e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3740e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3741e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3742e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 3743e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3744e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 37451b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 3746607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3747607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movq,xmm1,0x00,1,2,1) // movq %%xmm1,(%1,%2) 37481b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 3749e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x10,%3 \n" 375018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3751e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "+r"(src_uyvy), // %0 3752e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(dst_u), // %1 3753c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_v), // %2 3754e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(pix) // %3 3755a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(stride_uyvy)) // %4 3756e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "memory", "cc" 3757607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 3758607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 3759607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 3760e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#if defined(__SSE2__) 3761e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 3762e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#endif 3763e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com ); 3764e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com} 3765e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 3766c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.comvoid UYVYToUV422Row_SSE2(const uint8* src_uyvy, 3767c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com uint8* dst_u, uint8* dst_v, int pix) { 3768c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com asm volatile ( 3769c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3770c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3771c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "sub %1,%2 \n" 37726f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3773c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "1: \n" 37741b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 37751b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 37761b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3777c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3778c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3779c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3780c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3781c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3782c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 3783c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3784c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 37851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 3786607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3787607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movq,xmm1,0x00,1,2,1) // movq %%xmm1,(%1,%2) 37881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 3789c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "sub $0x10,%3 \n" 3790c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "jg 1b \n" 3791c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : "+r"(src_uyvy), // %0 3792c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_u), // %1 3793c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_v), // %2 3794c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(pix) // %3 3795c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : 3796c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : "memory", "cc" 3797607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 3798607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 3799607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 3800c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com#if defined(__SSE2__) 3801c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com , "xmm0", "xmm1", "xmm5" 3802c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com#endif 3803c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com ); 3804c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com} 3805c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com 3806e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.comvoid UYVYToYRow_Unaligned_SSE2(const uint8* src_uyvy, 3807e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com uint8* dst_y, int pix) { 3808e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 38096f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3810e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 38111b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 38121b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 38131b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3814e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm0 \n" 3815e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3816e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 381718184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "sub $0x10,%2 \n" 38181b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 38191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 382018184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3821e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "+r"(src_uyvy), // %0 3822e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(dst_y), // %1 3823e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(pix) // %2 3824e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : 3825e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "memory", "cc" 3826e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#if defined(__SSE2__) 3827e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com , "xmm0", "xmm1" 3828e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#endif 3829e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com ); 3830e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com} 3831e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 3832e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.comvoid UYVYToUVRow_Unaligned_SSE2(const uint8* src_uyvy, int stride_uyvy, 3833c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com uint8* dst_u, uint8* dst_v, int pix) { 3834e14b2abba48ba88dba26b40773e98714d295b1acfbarchard@google.com asm volatile ( 3835e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3836e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3837e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub %1,%2 \n" 38386f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3839e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "1: \n" 38401b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 38411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 3842607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3843607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x00,0,4,1,xmm2) // movdqu (%0,%4,1),%%xmm2 3844607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPREG(movdqu,0x10,0,4,1,xmm3) // movdqu 0x10(%0,%4,1),%%xmm3 38451b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3846e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm2,%%xmm0 \n" 3847e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pavgb %%xmm3,%%xmm1 \n" 3848e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3849e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3850e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3851e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3852e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3853e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 3854e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3855e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 38561b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 3857607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3858607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movq,xmm1,0x00,1,2,1) // movq %%xmm1,(%1,%2) 38591b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 3860e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "sub $0x10,%3 \n" 386118184fd19dba08d6567357e3913285a779e4b9f3fbarchard@google.com "jg 1b \n" 3862e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "+r"(src_uyvy), // %0 3863e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(dst_u), // %1 3864c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_v), // %2 3865e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com "+r"(pix) // %3 3866a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(stride_uyvy)) // %4 3867e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com : "memory", "cc" 3868607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 3869607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 3870607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 3871e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#if defined(__SSE2__) 3872e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 3873e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com#endif 3874e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com ); 3875e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com} 3876c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com 3877c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.comvoid UYVYToUV422Row_Unaligned_SSE2(const uint8* src_uyvy, 3878c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com uint8* dst_u, uint8* dst_v, int pix) { 3879c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com asm volatile ( 3880c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3881c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm5 \n" 3882c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "sub %1,%2 \n" 38836f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3884c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "1: \n" 38851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 38861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 38871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 3888c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3889c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3890c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 3891c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 3892c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 3893c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 3894c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3895c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 38961b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 3897607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com BUNDLEALIGN 3898607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com MEMOPMEM(movq,xmm1,0x00,1,2,1) // movq %%xmm1,(%1,%2) 38991b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 3900c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "sub $0x10,%3 \n" 3901c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "jg 1b \n" 3902c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : "+r"(src_uyvy), // %0 3903c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_u), // %1 3904c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(dst_v), // %2 3905c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com "+r"(pix) // %3 3906c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : 3907c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com : "memory", "cc" 3908607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 3909607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com , "r14" 3910607dc47533cab251f63fdd315bd365fb265a5a36nfullagar@google.com#endif 3911c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com#if defined(__SSE2__) 3912c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com , "xmm0", "xmm1", "xmm5" 3913c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com#endif 3914c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com ); 3915c704f789e9305890d865e6334f57a9febbc83e45fbarchard@google.com} 3916b95dbf24951d8b7118f680d75c7456a5f5d57bfffbarchard@google.com#endif // HAS_YUY2TOYROW_SSE2 3917e5f3fd4cc870b9b22112b3b2f25af06e067c8b7dfbarchard@google.com 3918ba3aeed3b86dfae7bc0631c8bed9b50303318dcafbarchard@google.com#ifdef HAS_ARGBBLENDROW_SSE2 391996af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com// Blend 8 pixels at a time. 3920bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.comvoid ARGBBlendRow_SSE2(const uint8* src_argb0, const uint8* src_argb1, 3921bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com uint8* dst_argb, int width) { 3922c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com asm volatile ( 3923c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pcmpeqb %%xmm7,%%xmm7 \n" 3924c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psrlw $0xf,%%xmm7 \n" 3925c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pcmpeqb %%xmm6,%%xmm6 \n" 3926c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psrlw $0x8,%%xmm6 \n" 3927c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 3928c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psllw $0x8,%%xmm5 \n" 3929c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 3930c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pslld $0x18,%%xmm4 \n" 3931bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "sub $0x1,%3 \n" 3932bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "je 91f \n" 3933bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jl 99f \n" 3934c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com 3935bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com // 1 pixel loop until destination pointer is aligned. 3936bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "10: \n" 3937bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "test $0xf,%2 \n" 3938bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "je 19f \n" 39391b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(0) ",%%xmm3 \n" 39401b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,0) ",%0 \n" 3941bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "movdqa %%xmm3,%%xmm0 \n" 3942bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pxor %%xmm4,%%xmm3 \n" 39431b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(1) ",%%xmm2 \n" 3944bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "psrlw $0x8,%%xmm3 \n" 3945bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pshufhw $0xf5,%%xmm3,%%xmm3 \n" 3946bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pshuflw $0xf5,%%xmm3,%%xmm3 \n" 3947bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pand %%xmm6,%%xmm2 \n" 3948bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "paddw %%xmm7,%%xmm3 \n" 3949bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pmullw %%xmm3,%%xmm2 \n" 39501b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(1) ",%%xmm1 \n" 39511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,1) ",%1 \n" 3952bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3953bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "por %%xmm4,%%xmm0 \n" 3954bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pmullw %%xmm3,%%xmm1 \n" 3955bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "psrlw $0x8,%%xmm2 \n" 3956bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "paddusb %%xmm2,%%xmm0 \n" 3957bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3958bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 3959bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "sub $0x1,%3 \n" 39601b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd %%xmm0," MEMACCESS(2) " \n" 39611b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,2) ",%2 \n" 3962bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jge 10b \n" 3963bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com 3964bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "19: \n" 3965ee2208885f7efbe236d4070628948fe079527bfdfbarchard@google.com "add $1-4,%3 \n" 3966bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jl 49f \n" 3967bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com 3968794fe1236a29b272cf36442c8c4c3d97a33ff64ffbarchard@google.com // 4 pixel loop. 39696f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 3970bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "41: \n" 39711b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm3 \n" 39721b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 3973c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "movdqa %%xmm3,%%xmm0 \n" 3974c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pxor %%xmm4,%%xmm3 \n" 39751b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm2 \n" 3976c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psrlw $0x8,%%xmm3 \n" 3977c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pshufhw $0xf5,%%xmm3,%%xmm3 \n" 3978c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pshuflw $0xf5,%%xmm3,%%xmm3 \n" 3979c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pand %%xmm6,%%xmm2 \n" 3980c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "paddw %%xmm7,%%xmm3 \n" 3981c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pmullw %%xmm3,%%xmm2 \n" 39821b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm1 \n" 39831b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 3984c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 3985c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "por %%xmm4,%%xmm0 \n" 3986c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pmullw %%xmm3,%%xmm1 \n" 3987c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psrlw $0x8,%%xmm2 \n" 3988c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "paddusb %%xmm2,%%xmm0 \n" 3989c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 3990c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 3991c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "sub $0x4,%3 \n" 39921b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(2) " \n" 39931b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 3994bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jge 41b \n" 3995c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com 3996bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "49: \n" 3997bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "add $0x3,%3 \n" 3998bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jl 99f \n" 3999c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com 4000794fe1236a29b272cf36442c8c4c3d97a33ff64ffbarchard@google.com // 1 pixel loop. 4001bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "91: \n" 40021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(0) ",%%xmm3 \n" 40031b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,0) ",%0 \n" 4004c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "movdqa %%xmm3,%%xmm0 \n" 4005c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pxor %%xmm4,%%xmm3 \n" 40061b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(1) ",%%xmm2 \n" 4007c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psrlw $0x8,%%xmm3 \n" 4008c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pshufhw $0xf5,%%xmm3,%%xmm3 \n" 4009c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pshuflw $0xf5,%%xmm3,%%xmm3 \n" 4010c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pand %%xmm6,%%xmm2 \n" 4011c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "paddw %%xmm7,%%xmm3 \n" 4012c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pmullw %%xmm3,%%xmm2 \n" 40131b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(1) ",%%xmm1 \n" 40141b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,1) ",%1 \n" 4015c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 4016c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "por %%xmm4,%%xmm0 \n" 4017c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pmullw %%xmm3,%%xmm1 \n" 4018c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "psrlw $0x8,%%xmm2 \n" 4019c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "paddusb %%xmm2,%%xmm0 \n" 4020c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 4021c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 4022c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com "sub $0x1,%3 \n" 40231b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd %%xmm0," MEMACCESS(2) " \n" 40241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,2) ",%2 \n" 4025bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jge 91b \n" 4026bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "99: \n" 4027bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com : "+r"(src_argb0), // %0 4028bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "+r"(src_argb1), // %1 4029bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "+r"(dst_argb), // %2 4030bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "+r"(width) // %3 4031c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com : 4032c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com : "memory", "cc" 4033c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com#if defined(__SSE2__) 4034c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 4035c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com#endif 4036c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com ); 4037c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com} 4038bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com#endif // HAS_ARGBBLENDROW_SSE2 403996af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com 404096af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com#ifdef HAS_ARGBBLENDROW_SSSE3 4041bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// Shuffle table for isolating alpha. 4042f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleAlpha = { 404396af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com 3u, 0x80, 3u, 0x80, 7u, 0x80, 7u, 0x80, 404496af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com 11u, 0x80, 11u, 0x80, 15u, 0x80, 15u, 0x80 404596af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com}; 4046bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com 4047bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// Blend 8 pixels at a time 4048bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// Shuffle table for reversing the bytes. 4049bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com 4050bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// Same as SSE2, but replaces 4051bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// psrlw xmm3, 8 // alpha 4052bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// pshufhw xmm3, xmm3,0F5h // 8 alpha words 4053bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// pshuflw xmm3, xmm3,0F5h 4054bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// with.. 4055bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com// pshufb xmm3, kShuffleAlpha // alpha 4056bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com 4057bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.comvoid ARGBBlendRow_SSSE3(const uint8* src_argb0, const uint8* src_argb1, 4058bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com uint8* dst_argb, int width) { 405996af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com asm volatile ( 406096af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pcmpeqb %%xmm7,%%xmm7 \n" 406196af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "psrlw $0xf,%%xmm7 \n" 406296af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pcmpeqb %%xmm6,%%xmm6 \n" 406396af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "psrlw $0x8,%%xmm6 \n" 406496af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 406596af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "psllw $0x8,%%xmm5 \n" 406696af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 406796af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pslld $0x18,%%xmm4 \n" 4068bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "sub $0x1,%3 \n" 4069bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "je 91f \n" 4070bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jl 99f \n" 4071c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com 4072bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com // 1 pixel loop until destination pointer is aligned. 4073bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "10: \n" 4074bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "test $0xf,%2 \n" 4075bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "je 19f \n" 40761b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(0) ",%%xmm3 \n" 40771b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,0) ",%0 \n" 4078bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "movdqa %%xmm3,%%xmm0 \n" 4079bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pxor %%xmm4,%%xmm3 \n" 40801b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(1) ",%%xmm2 \n" 4081bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pshufb %4,%%xmm3 \n" 4082bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pand %%xmm6,%%xmm2 \n" 4083bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "paddw %%xmm7,%%xmm3 \n" 4084bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pmullw %%xmm3,%%xmm2 \n" 40851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(1) ",%%xmm1 \n" 40861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,1) ",%1 \n" 4087bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 4088bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "por %%xmm4,%%xmm0 \n" 4089bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pmullw %%xmm3,%%xmm1 \n" 4090bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "psrlw $0x8,%%xmm2 \n" 4091bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "paddusb %%xmm2,%%xmm0 \n" 4092bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 4093bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 4094bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "sub $0x1,%3 \n" 40951b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd %%xmm0," MEMACCESS(2) " \n" 40961b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,2) ",%2 \n" 4097bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jge 10b \n" 4098bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com 4099bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "19: \n" 4100ee2208885f7efbe236d4070628948fe079527bfdfbarchard@google.com "add $1-4,%3 \n" 4101bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jl 49f \n" 4102f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "test $0xf,%0 \n" 4103f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "jne 41f \n" 4104f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "test $0xf,%1 \n" 4105f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "jne 41f \n" 4106bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com 4107794fe1236a29b272cf36442c8c4c3d97a33ff64ffbarchard@google.com // 4 pixel loop. 41086f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4109f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "40: \n" 41101b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm3 \n" 41111b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 4112f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "movdqa %%xmm3,%%xmm0 \n" 4113f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "pxor %%xmm4,%%xmm3 \n" 41141b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm2 \n" 4115f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "pshufb %4,%%xmm3 \n" 4116f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "pand %%xmm6,%%xmm2 \n" 4117f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "paddw %%xmm7,%%xmm3 \n" 4118f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "pmullw %%xmm3,%%xmm2 \n" 41191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm1 \n" 41201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 4121f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 4122f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "por %%xmm4,%%xmm0 \n" 4123f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "pmullw %%xmm3,%%xmm1 \n" 4124f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "psrlw $0x8,%%xmm2 \n" 4125f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "paddusb %%xmm2,%%xmm0 \n" 4126f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 4127f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 4128f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "sub $0x4,%3 \n" 41291b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(2) " \n" 41301b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 4131f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "jge 40b \n" 4132f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com "jmp 49f \n" 4133f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com 4134f877e71995128ae4c945591574367da5d66a1ac4fbarchard@google.com // 4 pixel unaligned loop. 41356f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4136bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "41: \n" 41371b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm3 \n" 41381b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 413996af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "movdqa %%xmm3,%%xmm0 \n" 414096af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pxor %%xmm4,%%xmm3 \n" 41411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm2 \n" 4142794fe1236a29b272cf36442c8c4c3d97a33ff64ffbarchard@google.com "pshufb %4,%%xmm3 \n" 414396af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pand %%xmm6,%%xmm2 \n" 414496af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "paddw %%xmm7,%%xmm3 \n" 414596af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pmullw %%xmm3,%%xmm2 \n" 41461b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm1 \n" 41471b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 414896af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 414996af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "por %%xmm4,%%xmm0 \n" 415096af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pmullw %%xmm3,%%xmm1 \n" 415196af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "psrlw $0x8,%%xmm2 \n" 4152bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "paddusb %%xmm2,%%xmm0 \n" 415396af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 4154bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 415596af870c8ae80f30858478258ca8a63298d9be67fbarchard@google.com "sub $0x4,%3 \n" 41561b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(2) " \n" 41571b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 4158bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jge 41b \n" 4159c757f308eab211f9d5467a089052e7d84606f6c1fbarchard@google.com 4160bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "49: \n" 4161bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "add $0x3,%3 \n" 4162bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jl 99f \n" 41635ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com 4164794fe1236a29b272cf36442c8c4c3d97a33ff64ffbarchard@google.com // 1 pixel loop. 4165bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "91: \n" 41661b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(0) ",%%xmm3 \n" 41671b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,0) ",%0 \n" 41685ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "movdqa %%xmm3,%%xmm0 \n" 41695ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "pxor %%xmm4,%%xmm3 \n" 41701b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(1) ",%%xmm2 \n" 41715ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "pshufb %4,%%xmm3 \n" 41725ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "pand %%xmm6,%%xmm2 \n" 41735ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "paddw %%xmm7,%%xmm3 \n" 41745ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "pmullw %%xmm3,%%xmm2 \n" 41751b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(1) ",%%xmm1 \n" 41761b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,1) ",%1 \n" 41775ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "psrlw $0x8,%%xmm1 \n" 41785ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "por %%xmm4,%%xmm0 \n" 41795ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "pmullw %%xmm3,%%xmm1 \n" 41805ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "psrlw $0x8,%%xmm2 \n" 41815ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "paddusb %%xmm2,%%xmm0 \n" 41825ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "pand %%xmm5,%%xmm1 \n" 41835ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 41845ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "sub $0x1,%3 \n" 41851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd %%xmm0," MEMACCESS(2) " \n" 41861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,2) ",%2 \n" 4187bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "jge 91b \n" 4188bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com "99: \n" 41895ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com : "+r"(src_argb0), // %0 41905ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "+r"(src_argb1), // %1 41915ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "+r"(dst_argb), // %2 41925ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com "+r"(width) // %3 41935ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com : "m"(kShuffleAlpha) // %4 41945ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com : "memory", "cc" 41955ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com#if defined(__SSE2__) 41965ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 41975ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com#endif 41985ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com ); 41995ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com} 4200bac5f2c3ee12535817448e606c7a7704bbae8321fbarchard@google.com#endif // HAS_ARGBBLENDROW_SSSE3 42015ff3a8fec5fa54bca8905f1eb6eb69c14d5fb79ffbarchard@google.com 42021d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com#ifdef HAS_ARGBATTENUATEROW_SSE2 42038ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com// Attenuate 4 pixels at a time. 42048ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com// aligned to 16 bytes 42058ed54222e723037322579f15c36d4faddb924e91fbarchard@google.comvoid ARGBAttenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width) { 42068ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com asm volatile ( 42078ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 42088ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pslld $0x18,%%xmm4 \n" 42098ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 42108ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "psrld $0x8,%%xmm5 \n" 4211810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com 421281b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com // 4 pixel loop. 42136f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 42148ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "1: \n" 42151b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 42168ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "punpcklbw %%xmm0,%%xmm0 \n" 42178ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pshufhw $0xff,%%xmm0,%%xmm2 \n" 42188ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pshuflw $0xff,%%xmm2,%%xmm2 \n" 42198ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pmulhuw %%xmm2,%%xmm0 \n" 42201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm1 \n" 42218ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "punpckhbw %%xmm1,%%xmm1 \n" 42228ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pshufhw $0xff,%%xmm1,%%xmm2 \n" 42238ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pshuflw $0xff,%%xmm2,%%xmm2 \n" 42248ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pmulhuw %%xmm2,%%xmm1 \n" 42251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm2 \n" 42261b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 42278ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "psrlw $0x8,%%xmm0 \n" 4228810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pand %%xmm4,%%xmm2 \n" 42298ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 42308ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 42318ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 4232810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "por %%xmm2,%%xmm0 \n" 42338ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "sub $0x4,%2 \n" 42341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 42351b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 42368ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "jg 1b \n" 42378ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com : "+r"(src_argb), // %0 42388ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "+r"(dst_argb), // %1 42398ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com "+r"(width) // %2 42408ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com : 42418ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com : "memory", "cc" 42428ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com#if defined(__SSE2__) 42438ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 42448ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com#endif 42458ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com ); 42468ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com} 42471d160cb99f2b05df80c4555bd769825ad1175dc9fbarchard@google.com#endif // HAS_ARGBATTENUATEROW_SSE2 42488ed54222e723037322579f15c36d4faddb924e91fbarchard@google.com 4249eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com#ifdef HAS_ARGBATTENUATEROW_SSSE3 4250810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com// Shuffle table duplicating alpha 4251f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleAlpha0 = { 4252810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com 3u, 3u, 3u, 3u, 3u, 3u, 128u, 128u, 7u, 7u, 7u, 7u, 7u, 7u, 128u, 128u, 4253810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com}; 4254f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic uvec8 kShuffleAlpha1 = { 4255810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com 11u, 11u, 11u, 11u, 11u, 11u, 128u, 128u, 4256810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com 15u, 15u, 15u, 15u, 15u, 15u, 128u, 128u, 4257810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com}; 4258810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com// Attenuate 4 pixels at a time. 4259810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com// aligned to 16 bytes 4260810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.comvoid ARGBAttenuateRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) { 4261810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com asm volatile ( 4262810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pcmpeqb %%xmm3,%%xmm3 \n" 4263810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pslld $0x18,%%xmm3 \n" 4264810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "movdqa %3,%%xmm4 \n" 4265810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "movdqa %4,%%xmm5 \n" 4266810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com 426781b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com // 4 pixel loop. 42686f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4269810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "1: \n" 42701b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 4271810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pshufb %%xmm4,%%xmm0 \n" 42721b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm1 \n" 4273810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "punpcklbw %%xmm1,%%xmm1 \n" 4274810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pmulhuw %%xmm1,%%xmm0 \n" 42751b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm1 \n" 4276810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pshufb %%xmm5,%%xmm1 \n" 42771b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm2 \n" 4278810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "punpckhbw %%xmm2,%%xmm2 \n" 4279810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pmulhuw %%xmm2,%%xmm1 \n" 42801b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm2 \n" 42811b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 4282810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pand %%xmm3,%%xmm2 \n" 4283810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "psrlw $0x8,%%xmm0 \n" 4284810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 4285810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 4286810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "por %%xmm2,%%xmm0 \n" 4287810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "sub $0x4,%2 \n" 42881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 42891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 4290810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "jg 1b \n" 4291810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com : "+r"(src_argb), // %0 4292810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "+r"(dst_argb), // %1 4293810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "+r"(width) // %2 4294810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com : "m"(kShuffleAlpha0), // %3 4295810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "m"(kShuffleAlpha1) // %4 4296810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com : "memory", "cc" 4297810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com#if defined(__SSE2__) 4298810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 4299810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com#endif 4300810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com ); 4301810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com} 4302eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com#endif // HAS_ARGBATTENUATEROW_SSSE3 4303810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com 4304eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com#ifdef HAS_ARGBUNATTENUATEROW_SSE2 4305810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com// Unattenuate 4 pixels at a time. 4306810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com// aligned to 16 bytes 4307810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.comvoid ARGBUnattenuateRow_SSE2(const uint8* src_argb, uint8* dst_argb, 4308810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com int width) { 4309810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com uintptr_t alpha = 0; 4310810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com asm volatile ( 431181b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com // 4 pixel loop. 43126f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4313810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "1: \n" 43141b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 43151b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movzb " MEMACCESS2(0x03,0) ",%3 \n" 4316810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "punpcklbw %%xmm0,%%xmm0 \n" 4317bb5ea8e4df7aba47d39a0b6e74ce7cc85e5c8c3afbarchard@google.com MEMOPREG(movd,0x00,4,3,4,xmm2) // movd 0x0(%4,%3,4),%%xmm2 43181b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movzb " MEMACCESS2(0x07,0) ",%3 \n" 4319bb5ea8e4df7aba47d39a0b6e74ce7cc85e5c8c3afbarchard@google.com MEMOPREG(movd,0x00,4,3,4,xmm3) // movd 0x0(%4,%3,4),%%xmm3 4320787f82766394fc13ff99bb68308c922c014a6f1dfbarchard@google.com "pshuflw $0x40,%%xmm2,%%xmm2 \n" 4321787f82766394fc13ff99bb68308c922c014a6f1dfbarchard@google.com "pshuflw $0x40,%%xmm3,%%xmm3 \n" 4322810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "movlhps %%xmm3,%%xmm2 \n" 4323810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pmulhuw %%xmm2,%%xmm0 \n" 43241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm1 \n" 43251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movzb " MEMACCESS2(0x0b,0) ",%3 \n" 4326810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "punpckhbw %%xmm1,%%xmm1 \n" 43276f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com BUNDLEALIGN 4328bb5ea8e4df7aba47d39a0b6e74ce7cc85e5c8c3afbarchard@google.com MEMOPREG(movd,0x00,4,3,4,xmm2) // movd 0x0(%4,%3,4),%%xmm2 43291b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movzb " MEMACCESS2(0x0f,0) ",%3 \n" 4330bb5ea8e4df7aba47d39a0b6e74ce7cc85e5c8c3afbarchard@google.com MEMOPREG(movd,0x00,4,3,4,xmm3) // movd 0x0(%4,%3,4),%%xmm3 4331787f82766394fc13ff99bb68308c922c014a6f1dfbarchard@google.com "pshuflw $0x40,%%xmm2,%%xmm2 \n" 4332787f82766394fc13ff99bb68308c922c014a6f1dfbarchard@google.com "pshuflw $0x40,%%xmm3,%%xmm3 \n" 4333810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "movlhps %%xmm3,%%xmm2 \n" 4334810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "pmulhuw %%xmm2,%%xmm1 \n" 43351b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 4336810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 4337810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "sub $0x4,%2 \n" 43381b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 43391b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 4340810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "jg 1b \n" 4341810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com : "+r"(src_argb), // %0 4342810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "+r"(dst_argb), // %1 4343810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "+r"(width), // %2 4344810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com "+r"(alpha) // %3 4345810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com : "r"(fixed_invtbl8) // %4 4346810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com : "memory", "cc" 4347bb5ea8e4df7aba47d39a0b6e74ce7cc85e5c8c3afbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 4348bb5ea8e4df7aba47d39a0b6e74ce7cc85e5c8c3afbarchard@google.com , "r14" 4349bb5ea8e4df7aba47d39a0b6e74ce7cc85e5c8c3afbarchard@google.com#endif 4350810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com#if defined(__SSE2__) 4351810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 4352810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com#endif 4353810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com ); 4354810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com} 4355eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com#endif // HAS_ARGBUNATTENUATEROW_SSE2 4356810cd91079505f04cfec7481b51d04f08250d982fbarchard@google.com 4357ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com#ifdef HAS_ARGBGRAYROW_SSSE3 4358ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com// Convert 8 ARGB pixels (64 bytes) to 8 Gray ARGB pixels 4359eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.comvoid ARGBGrayRow_SSSE3(const uint8* src_argb, uint8* dst_argb, int width) { 4360ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com asm volatile ( 4361eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com "movdqa %3,%%xmm4 \n" 4362050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "movdqa %4,%%xmm5 \n" 436381b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com 436481b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com // 8 pixel loop. 43656f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4366ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "1: \n" 43671b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 43681b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 4369ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "pmaddubsw %%xmm4,%%xmm0 \n" 4370ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 4371ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "phaddw %%xmm1,%%xmm0 \n" 4372050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "paddw %%xmm5,%%xmm0 \n" 4373ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "psrlw $0x7,%%xmm0 \n" 4374ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 43751b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm2 \n" 43761b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm3 \n" 43771b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 4378221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "psrld $0x18,%%xmm2 \n" 4379221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "psrld $0x18,%%xmm3 \n" 4380221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "packuswb %%xmm3,%%xmm2 \n" 4381221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "packuswb %%xmm2,%%xmm2 \n" 4382221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "movdqa %%xmm0,%%xmm3 \n" 4383ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "punpcklbw %%xmm0,%%xmm0 \n" 4384221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "punpcklbw %%xmm2,%%xmm3 \n" 4385ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 4386221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "punpcklwd %%xmm3,%%xmm0 \n" 4387221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "punpckhwd %%xmm3,%%xmm1 \n" 4388eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com "sub $0x8,%2 \n" 43891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 43901b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,1) " \n" 43911b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 4392ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com "jg 1b \n" 4393eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com : "+r"(src_argb), // %0 4394eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com "+r"(dst_argb), // %1 4395eeac2903ef22110d475c50ef9bfd7826d3183a5efbarchard@google.com "+r"(width) // %2 4396050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com : "m"(kARGBToYJ), // %3 4397050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com "m"(kAddYJ64) // %4 4398ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com : "memory", "cc" 4399ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com#if defined(__SSE2__) 4400050b39a5cbf6c0f529531aafba36f2c846a139b1fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 4401ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com#endif 4402ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com ); 4403ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com} 4404ffaea7eee38e593a3e63553ffa90e554ba81fe30fbarchard@google.com#endif // HAS_ARGBGRAYROW_SSSE3 4405221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com 4406221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com#ifdef HAS_ARGBSEPIAROW_SSSE3 4407221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com// b = (r * 35 + g * 68 + b * 17) >> 7 4408221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com// g = (r * 45 + g * 88 + b * 22) >> 7 4409221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com// r = (r * 50 + g * 98 + b * 24) >> 7 4410221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com// Constant for ARGB color to sepia tone 4411f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToSepiaB = { 4412221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com 17, 68, 35, 0, 17, 68, 35, 0, 17, 68, 35, 0, 17, 68, 35, 0 4413221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com}; 4414221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com 4415f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToSepiaG = { 4416221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com 22, 88, 45, 0, 22, 88, 45, 0, 22, 88, 45, 0, 22, 88, 45, 0 4417221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com}; 4418221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com 4419f2aa91a1ac08703d5a22af7fa48c59eba8eb397afbarchard@google.comstatic vec8 kARGBToSepiaR = { 4420221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com 24, 98, 50, 0, 24, 98, 50, 0, 24, 98, 50, 0, 24, 98, 50, 0 4421221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com}; 4422221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com 4423e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com// Convert 8 ARGB pixels (32 bytes) to 8 Sepia ARGB pixels. 4424221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.comvoid ARGBSepiaRow_SSSE3(uint8* dst_argb, int width) { 4425221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com asm volatile ( 4426221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "movdqa %2,%%xmm2 \n" 4427221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "movdqa %3,%%xmm3 \n" 4428221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "movdqa %4,%%xmm4 \n" 442981b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com 443081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com // 8 pixel loop. 44316f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4432221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "1: \n" 44331b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 44341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm6 \n" 4435221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "pmaddubsw %%xmm2,%%xmm0 \n" 4436221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "pmaddubsw %%xmm2,%%xmm6 \n" 4437221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "phaddw %%xmm6,%%xmm0 \n" 4438221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "psrlw $0x7,%%xmm0 \n" 4439221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 44401b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm5 \n" 44411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 4442221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "pmaddubsw %%xmm3,%%xmm5 \n" 4443221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 4444221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "phaddw %%xmm1,%%xmm5 \n" 4445221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "psrlw $0x7,%%xmm5 \n" 4446221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "packuswb %%xmm5,%%xmm5 \n" 4447221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 44481b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm5 \n" 44491b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 4450221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "pmaddubsw %%xmm4,%%xmm5 \n" 4451221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 4452221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "phaddw %%xmm1,%%xmm5 \n" 4453221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "psrlw $0x7,%%xmm5 \n" 4454221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "packuswb %%xmm5,%%xmm5 \n" 44551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm6 \n" 44561b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 4457221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "psrld $0x18,%%xmm6 \n" 4458221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "psrld $0x18,%%xmm1 \n" 4459221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "packuswb %%xmm1,%%xmm6 \n" 4460221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "packuswb %%xmm6,%%xmm6 \n" 4461221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "punpcklbw %%xmm6,%%xmm5 \n" 4462221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 4463221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "punpcklwd %%xmm5,%%xmm0 \n" 4464221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "punpckhwd %%xmm5,%%xmm1 \n" 4465221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "sub $0x8,%1 \n" 44661b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(0) " \n" 44671b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,0) " \n" 44681b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 4469221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "jg 1b \n" 4470221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com : "+r"(dst_argb), // %0 4471221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "+r"(width) // %1 4472221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com : "m"(kARGBToSepiaB), // %2 4473221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "m"(kARGBToSepiaG), // %3 4474221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com "m"(kARGBToSepiaR) // %4 4475221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com : "memory", "cc" 4476221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com#if defined(__SSE2__) 4477221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6" 4478221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com#endif 4479221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com ); 4480221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com} 4481221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com#endif // HAS_ARGBSEPIAROW_SSSE3 4482221e602f8a726f7457a0d521b5bcca05d89215bbfbarchard@google.com 4483e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com#ifdef HAS_ARGBCOLORMATRIXROW_SSSE3 4484e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com// Tranform 8 ARGB pixels (32 bytes) with color matrix. 4485e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com// Same as Sepia except matrix is provided. 4486c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.comvoid ARGBColorMatrixRow_SSSE3(const uint8* src_argb, uint8* dst_argb, 4487c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com const int8* matrix_argb, int width) { 4488e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com asm volatile ( 44894a4b7374c12598560904609c91059003b57bc3d4fbarchard@google.com "movdqu " MEMACCESS(3) ",%%xmm5 \n" 44904a4b7374c12598560904609c91059003b57bc3d4fbarchard@google.com "pshufd $0x00,%%xmm5,%%xmm2 \n" 44914a4b7374c12598560904609c91059003b57bc3d4fbarchard@google.com "pshufd $0x55,%%xmm5,%%xmm3 \n" 44924a4b7374c12598560904609c91059003b57bc3d4fbarchard@google.com "pshufd $0xaa,%%xmm5,%%xmm4 \n" 44934a4b7374c12598560904609c91059003b57bc3d4fbarchard@google.com "pshufd $0xff,%%xmm5,%%xmm5 \n" 449481b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com 449581b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com // 8 pixel loop. 44966f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4497e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com "1: \n" 44981b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 44991b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm7 \n" 4500e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com "pmaddubsw %%xmm2,%%xmm0 \n" 4501c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "pmaddubsw %%xmm2,%%xmm7 \n" 45021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm6 \n" 45031b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 4504c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm6 \n" 4505e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com "pmaddubsw %%xmm3,%%xmm1 \n" 4506c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "phaddsw %%xmm7,%%xmm0 \n" 4507c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "phaddsw %%xmm1,%%xmm6 \n" 4508c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "psraw $0x6,%%xmm0 \n" 4509c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "psraw $0x6,%%xmm6 \n" 45108f439eac1dc6352c214d3797a2af5cee80ead300fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 4511c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "packuswb %%xmm6,%%xmm6 \n" 4512c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "punpcklbw %%xmm6,%%xmm0 \n" 45131b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm1 \n" 45141b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm7 \n" 4515e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm1 \n" 4516c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "pmaddubsw %%xmm4,%%xmm7 \n" 4517c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "phaddsw %%xmm7,%%xmm1 \n" 45181b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm6 \n" 45191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm7 \n" 4520c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "pmaddubsw %%xmm5,%%xmm6 \n" 4521c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "pmaddubsw %%xmm5,%%xmm7 \n" 4522c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "phaddsw %%xmm7,%%xmm6 \n" 4523c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "psraw $0x6,%%xmm1 \n" 4524c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "psraw $0x6,%%xmm6 \n" 4525c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "packuswb %%xmm1,%%xmm1 \n" 4526e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com "packuswb %%xmm6,%%xmm6 \n" 4527c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "punpcklbw %%xmm6,%%xmm1 \n" 4528c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "movdqa %%xmm0,%%xmm6 \n" 4529c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "punpcklwd %%xmm1,%%xmm0 \n" 4530c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "punpckhwd %%xmm1,%%xmm6 \n" 4531c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "sub $0x8,%2 \n" 45321b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 45331b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm6," MEMACCESS2(0x10,1) " \n" 45341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 45351b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 4536e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com "jg 1b \n" 4537c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com : "+r"(src_argb), // %0 4538c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "+r"(dst_argb), // %1 4539c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com "+r"(width) // %2 4540c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com : "r"(matrix_argb) // %3 4541e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com : "memory", "cc" 4542e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com#if defined(__SSE2__) 4543c99db063e24d6180740d4adc29e84159096eef2dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 4544e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com#endif 4545e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com ); 4546e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com} 4547e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com#endif // HAS_ARGBCOLORMATRIXROW_SSSE3 4548e442dc4c2a896e85419628e3b7d97c4dfbe71c9dfbarchard@google.com 454981b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com#ifdef HAS_ARGBQUANTIZEROW_SSE2 455081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com// Quantize 4 ARGB pixels (16 bytes). 455181b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com// aligned to 16 bytes 455281b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.comvoid ARGBQuantizeRow_SSE2(uint8* dst_argb, int scale, int interval_size, 455381b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com int interval_offset, int width) { 455481b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com asm volatile ( 455581b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "movd %2,%%xmm2 \n" 455681b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "movd %3,%%xmm3 \n" 455781b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "movd %4,%%xmm4 \n" 455881b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pshuflw $0x40,%%xmm2,%%xmm2 \n" 455981b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pshufd $0x44,%%xmm2,%%xmm2 \n" 456081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pshuflw $0x40,%%xmm3,%%xmm3 \n" 456181b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pshufd $0x44,%%xmm3,%%xmm3 \n" 456281b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pshuflw $0x40,%%xmm4,%%xmm4 \n" 456381b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pshufd $0x44,%%xmm4,%%xmm4 \n" 456481b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pxor %%xmm5,%%xmm5 \n" 456581b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pcmpeqb %%xmm6,%%xmm6 \n" 456681b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pslld $0x18,%%xmm6 \n" 456781b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com 456881b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com // 4 pixel loop. 45696f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 457081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "1: \n" 45711b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 457281b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 457381b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pmulhuw %%xmm2,%%xmm0 \n" 45741b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm1 \n" 457581b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "punpckhbw %%xmm5,%%xmm1 \n" 457681b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pmulhuw %%xmm2,%%xmm1 \n" 457781b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pmullw %%xmm3,%%xmm0 \n" 45781b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm7 \n" 457981b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pmullw %%xmm3,%%xmm1 \n" 458081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "pand %%xmm6,%%xmm7 \n" 458181b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "paddw %%xmm4,%%xmm0 \n" 458281b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "paddw %%xmm4,%%xmm1 \n" 458381b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 458481b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "por %%xmm7,%%xmm0 \n" 458581b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "sub $0x4,%1 \n" 45861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(0) " \n" 45871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 458881b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "jg 1b \n" 458981b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com : "+r"(dst_argb), // %0 459081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "+r"(width) // %1 459181b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com : "r"(scale), // %2 459281b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "r"(interval_size), // %3 459381b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com "r"(interval_offset) // %4 459481b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com : "memory", "cc" 459581b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com#if defined(__SSE2__) 459681b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 459781b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com#endif 459881b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com ); 459981b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com} 460081b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com#endif // HAS_ARGBQUANTIZEROW_SSE2 460181b804e35c0346ee2fc5f8d11945eab9a88fdb10fbarchard@google.com 4602b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com#ifdef HAS_ARGBSHADEROW_SSE2 4603b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com// Shade 4 pixels at a time by specified value. 4604b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com// Aligned to 16 bytes. 4605b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.comvoid ARGBShadeRow_SSE2(const uint8* src_argb, uint8* dst_argb, int width, 4606b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com uint32 value) { 4607b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com asm volatile ( 4608b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "movd %3,%%xmm2 \n" 4609b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "punpcklbw %%xmm2,%%xmm2 \n" 4610b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "punpcklqdq %%xmm2,%%xmm2 \n" 4611b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com 4612b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com // 4 pixel loop. 46136f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4614b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "1: \n" 46151b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 46161b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 4617b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 4618b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "punpcklbw %%xmm0,%%xmm0 \n" 4619b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "punpckhbw %%xmm1,%%xmm1 \n" 4620b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "pmulhuw %%xmm2,%%xmm0 \n" 4621b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "pmulhuw %%xmm2,%%xmm1 \n" 4622b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "psrlw $0x8,%%xmm0 \n" 4623b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "psrlw $0x8,%%xmm1 \n" 4624b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 4625b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "sub $0x4,%2 \n" 46261b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 46271b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 4628b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com "jg 1b \n" 462983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com : "+r"(src_argb), // %0 463083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "+r"(dst_argb), // %1 463183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "+r"(width) // %2 463283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com : "r"(value) // %3 4633b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com : "memory", "cc" 4634b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com#if defined(__SSE2__) 4635b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com , "xmm0", "xmm1", "xmm2" 4636b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com#endif 4637b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com ); 4638b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com} 4639b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com#endif // HAS_ARGBSHADEROW_SSE2 4640b94b139e86635d40ed0d054bb66e30e6086ae7a3fbarchard@google.com 46418ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com#ifdef HAS_ARGBMULTIPLYROW_SSE2 464283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com// Multiply 2 rows of ARGB pixels together, 4 pixels at a time. 46438fa76349948802d728dd244a7b54051d751d8696fbarchard@google.comvoid ARGBMultiplyRow_SSE2(const uint8* src_argb0, const uint8* src_argb1, 46448fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com uint8* dst_argb, int width) { 46458ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com asm volatile ( 46468ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "pxor %%xmm5,%%xmm5 \n" 46478ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com 46488ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com // 4 pixel loop. 46496f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 46508ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "1: \n" 46511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 46521b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 46531b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm2 \n" 46541b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 4655bb92acade0cd17a83ad32177da6a449b2962066efbarchard@google.com "movdqu %%xmm0,%%xmm1 \n" 4656bb92acade0cd17a83ad32177da6a449b2962066efbarchard@google.com "movdqu %%xmm2,%%xmm3 \n" 46578ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "punpcklbw %%xmm0,%%xmm0 \n" 46588ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "punpckhbw %%xmm1,%%xmm1 \n" 46598ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 46608ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "punpckhbw %%xmm5,%%xmm3 \n" 46618ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "pmulhuw %%xmm2,%%xmm0 \n" 46628ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "pmulhuw %%xmm3,%%xmm1 \n" 46638ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 46648fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com "sub $0x4,%3 \n" 46651b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(2) " \n" 46661b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 46678ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com "jg 1b \n" 466883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com : "+r"(src_argb0), // %0 466983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "+r"(src_argb1), // %1 46708fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com "+r"(dst_argb), // %2 46718fa76349948802d728dd244a7b54051d751d8696fbarchard@google.com "+r"(width) // %3 46728ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com : 46738ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com : "memory", "cc" 46748ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com#if defined(__SSE2__) 46758ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 46768ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com#endif 46778ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com ); 46788ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com} 46798ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com#endif // HAS_ARGBMULTIPLYROW_SSE2 46808ec6033478a736f1b84203792a0b254a19391100fbarchard@google.com 468183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com#ifdef HAS_ARGBADDROW_SSE2 468283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com// Add 2 rows of ARGB pixels together, 4 pixels at a time. 468383e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.comvoid ARGBAddRow_SSE2(const uint8* src_argb0, const uint8* src_argb1, 468483e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com uint8* dst_argb, int width) { 468583e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com asm volatile ( 468683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com // 4 pixel loop. 46876f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 468883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "1: \n" 46891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 46901b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 46911b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm1 \n" 46921b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 469383e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 469483e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "sub $0x4,%3 \n" 46951b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(2) " \n" 46961b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 469783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "jg 1b \n" 469883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com : "+r"(src_argb0), // %0 469983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "+r"(src_argb1), // %1 470083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "+r"(dst_argb), // %2 470183e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com "+r"(width) // %3 470283e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com : 470383e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com : "memory", "cc" 470483e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com#if defined(__SSE2__) 4705573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com , "xmm0", "xmm1" 470683e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com#endif 470783e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com ); 470883e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com} 470983e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com#endif // HAS_ARGBADDROW_SSE2 471083e1b17cc0b1840c7b5e361fa19e7263fca2b32bfbarchard@google.com 4711573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com#ifdef HAS_ARGBSUBTRACTROW_SSE2 4712573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com// Subtract 2 rows of ARGB pixels, 4 pixels at a time. 4713573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.comvoid ARGBSubtractRow_SSE2(const uint8* src_argb0, const uint8* src_argb1, 4714573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com uint8* dst_argb, int width) { 4715573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com asm volatile ( 4716573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com // 4 pixel loop. 47176f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 4718573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com "1: \n" 47191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 47201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 47211b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm1 \n" 47221b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 4723573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com "psubusb %%xmm1,%%xmm0 \n" 4724573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com "sub $0x4,%3 \n" 47251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(2) " \n" 47261b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 4727573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com "jg 1b \n" 4728573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com : "+r"(src_argb0), // %0 4729573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com "+r"(src_argb1), // %1 4730573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com "+r"(dst_argb), // %2 4731573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com "+r"(width) // %3 4732573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com : 4733573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com : "memory", "cc" 4734573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com#if defined(__SSE2__) 4735573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com , "xmm0", "xmm1" 4736573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com#endif 4737573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com ); 4738573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com} 4739573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com#endif // HAS_ARGBSUBTRACTROW_SSE2 4740573a883dd65c94a10422e6e9e0d453e2a5d45227fbarchard@google.com 4741092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com#ifdef HAS_SOBELXROW_SSE2 47429d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// SobelX as a matrix is 47439d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// -1 0 1 47449d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// -2 0 2 47459d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// -1 0 1 4746092099507e44e9f429ec52956a20b28db634b910fbarchard@google.comvoid SobelXRow_SSE2(const uint8* src_y0, const uint8* src_y1, 4747092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com const uint8* src_y2, uint8* dst_sobelx, int width) { 47489d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com asm volatile ( 47499d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub %0,%1 \n" 47509d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub %0,%2 \n" 47519d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub %0,%3 \n" 47529d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "pxor %%xmm5,%%xmm5 \n" 47539d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com 47549d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com // 8 pixel loop. 47556f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 47569d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "1: \n" 47571b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS(0) ",%%xmm0 \n" 47581b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS2(0x2,0) ",%%xmm1 \n" 47599d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 47609d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm1 \n" 47619d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "psubw %%xmm1,%%xmm0 \n" 47621c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com BUNDLEALIGN 47631c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movq,0x00,0,1,1,xmm1) // movq (%0,%1,1),%%xmm1 47641c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movq,0x02,0,1,1,xmm2) // movq 0x2(%0,%1,1),%%xmm2 47659d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm1 \n" 47669d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 47679d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "psubw %%xmm2,%%xmm1 \n" 47681c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com BUNDLEALIGN 47691c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movq,0x00,0,2,1,xmm2) // movq (%0,%2,1),%%xmm2 47701c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movq,0x02,0,2,1,xmm3) // movq 0x2(%0,%2,1),%%xmm3 47719d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 47729d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm3 \n" 47739d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "psubw %%xmm3,%%xmm2 \n" 47749d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "paddw %%xmm2,%%xmm0 \n" 47759d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "paddw %%xmm1,%%xmm0 \n" 47769d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "paddw %%xmm1,%%xmm0 \n" 4777092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com "pxor %%xmm1,%%xmm1 \n" 4778092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com "psubw %%xmm0,%%xmm1 \n" 4779092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com "pmaxsw %%xmm1,%%xmm0 \n" 47809d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 47819d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub $0x8,%4 \n" 47821c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com BUNDLEALIGN 47831c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPMEM(movq,xmm0,0x00,0,3,1) // movq %%xmm0,(%0,%3,1) 47841b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 47859d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "jg 1b \n" 47869d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : "+r"(src_y0), // %0 47879d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(src_y1), // %1 47889d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(src_y2), // %2 47899d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(dst_sobelx), // %3 47909d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(width) // %4 47919d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : 47929d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : "memory", "cc" 47931c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 47941c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com , "r14" 47951c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com#endif 47969d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#if defined(__SSE2__) 47979d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 47989d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif 47999d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com ); 48009d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com} 4801092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com#endif // HAS_SOBELXROW_SSE2 48029d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com 4803092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com#ifdef HAS_SOBELYROW_SSE2 48049d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// SobelY as a matrix is 48059d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// -1 -2 -1 48069d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// 0 0 0 48079d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// 1 2 1 4808092099507e44e9f429ec52956a20b28db634b910fbarchard@google.comvoid SobelYRow_SSE2(const uint8* src_y0, const uint8* src_y1, 4809092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com uint8* dst_sobely, int width) { 48109d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com asm volatile ( 48119d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub %0,%1 \n" 48129d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub %0,%2 \n" 48139d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "pxor %%xmm5,%%xmm5 \n" 48149d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com 48159d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com // 8 pixel loop. 48166f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 48179d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "1: \n" 48181b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS(0) ",%%xmm0 \n" 48191c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movq,0x00,0,1,1,xmm1) // movq (%0,%1,1),%%xmm1 48209d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 48219d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm1 \n" 48229d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "psubw %%xmm1,%%xmm0 \n" 48231c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com BUNDLEALIGN 48241b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS2(0x1,0) ",%%xmm1 \n" 48251c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movq,0x01,0,1,1,xmm2) // movq 0x1(%0,%1,1),%%xmm2 48269d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm1 \n" 48279d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 48289d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "psubw %%xmm2,%%xmm1 \n" 48291c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com BUNDLEALIGN 48301b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS2(0x2,0) ",%%xmm2 \n" 48311c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movq,0x02,0,1,1,xmm3) // movq 0x2(%0,%1,1),%%xmm3 48329d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm2 \n" 48339d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm3 \n" 48349d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "psubw %%xmm3,%%xmm2 \n" 48359d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "paddw %%xmm2,%%xmm0 \n" 48369d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "paddw %%xmm1,%%xmm0 \n" 48379d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "paddw %%xmm1,%%xmm0 \n" 4838092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com "pxor %%xmm1,%%xmm1 \n" 4839092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com "psubw %%xmm0,%%xmm1 \n" 4840092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com "pmaxsw %%xmm1,%%xmm0 \n" 48419d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 48429d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub $0x8,%3 \n" 48431c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com BUNDLEALIGN 48441c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPMEM(movq,xmm0,0x00,0,2,1) // movq %%xmm0,(%0,%2,1) 48451b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 48469d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "jg 1b \n" 48479d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : "+r"(src_y0), // %0 48489d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(src_y1), // %1 48499d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(dst_sobely), // %2 48509d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(width) // %3 48519d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : 48529d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : "memory", "cc" 48531c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 48541c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com , "r14" 48551c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com#endif 48569d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#if defined(__SSE2__) 48579d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 48589d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif 48599d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com ); 48609d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com} 4861092099507e44e9f429ec52956a20b28db634b910fbarchard@google.com#endif // HAS_SOBELYROW_SSE2 48629d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com 48639d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#ifdef HAS_SOBELROW_SSE2 48649d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// Adds Sobel X and Sobel Y and stores Sobel into ARGB. 48659d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// A = 255 48669d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// R = Sobel 48679d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// G = Sobel 48689d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// B = Sobel 48699d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.comvoid SobelRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely, 4870c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com uint8* dst_argb, int width) { 48719d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com asm volatile ( 48729d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub %0,%1 \n" 48739d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 48749d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "pslld $0x18,%%xmm5 \n" 48759d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com 48769d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com // 8 pixel loop. 48776f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 48789d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "1: \n" 48791b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 48801c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movdqa,0x00,0,1,1,xmm1) // movdqa (%0,%1,1),%%xmm1 48811b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 48829d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 48839d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 48849d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm0,%%xmm2 \n" 48859d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpckhbw %%xmm0,%%xmm0 \n" 48869d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "movdqa %%xmm2,%%xmm1 \n" 48879d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklwd %%xmm2,%%xmm1 \n" 48889d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpckhwd %%xmm2,%%xmm2 \n" 48899d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "por %%xmm5,%%xmm1 \n" 48909d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "por %%xmm5,%%xmm2 \n" 48919d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "movdqa %%xmm0,%%xmm3 \n" 48929d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklwd %%xmm0,%%xmm3 \n" 48939d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpckhwd %%xmm0,%%xmm0 \n" 48949d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "por %%xmm5,%%xmm3 \n" 48959d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "por %%xmm5,%%xmm0 \n" 48969d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub $0x10,%3 \n" 48971b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm1," MEMACCESS(2) " \n" 48981b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm2," MEMACCESS2(0x10,2) " \n" 48991b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm3," MEMACCESS2(0x20,2) " \n" 49001b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS2(0x30,2) " \n" 49011b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,2) ",%2 \n" 49029d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "jg 1b \n" 49039d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : "+r"(src_sobelx), // %0 49049d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(src_sobely), // %1 49059d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(dst_argb), // %2 49069d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(width) // %3 49079d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : 49089d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : "memory", "cc" 49091c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 49101c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com , "r14" 49111c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com#endif 49129d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#if defined(__SSE2__) 49139d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" 49149d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif 49159d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com ); 49169d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com} 49179d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif // HAS_SOBELROW_SSE2 49189d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com 49198be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#ifdef HAS_SOBELTOPLANEROW_SSE2 49208be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com// Adds Sobel X and Sobel Y and stores Sobel into a plane. 49218be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.comvoid SobelToPlaneRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely, 49228be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com uint8* dst_y, int width) { 49238be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com asm volatile ( 49248be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "sub %0,%1 \n" 49258be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 49268be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "pslld $0x18,%%xmm5 \n" 49278be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com 49288be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com // 8 pixel loop. 49296f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 49308be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "1: \n" 49311b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 49328be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com MEMOPREG(movdqa,0x00,0,1,1,xmm1) // movdqa (%0,%1,1),%%xmm1 49331b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 49348be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "paddusb %%xmm1,%%xmm0 \n" 49358be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "sub $0x10,%3 \n" 49361b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(2) " \n" 49371b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 49388be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "jg 1b \n" 49398be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com : "+r"(src_sobelx), // %0 49408be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "+r"(src_sobely), // %1 49418be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "+r"(dst_y), // %2 49428be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com "+r"(width) // %3 49438be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com : 49448be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com : "memory", "cc" 49458be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 49468be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com , "r14" 49478be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#endif 49488be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#if defined(__SSE2__) 49498be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com , "xmm0", "xmm1" 49508be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#endif 49518be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com ); 49528be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com} 49538be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com#endif // HAS_SOBELTOPLANEROW_SSE2 49548be4b289c799356d84c68c4eb4b5403285096693fbarchard@google.com 49559d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#ifdef HAS_SOBELXYROW_SSE2 49569d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// Mixes Sobel X, Sobel Y and Sobel into ARGB. 49579d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// A = 255 49589d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// R = Sobel X 49599d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// G = Sobel 49609d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com// B = Sobel Y 49619d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.comvoid SobelXYRow_SSE2(const uint8* src_sobelx, const uint8* src_sobely, 49629d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com uint8* dst_argb, int width) { 49639d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com asm volatile ( 49649d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub %0,%1 \n" 49659d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 49669d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com 49679d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com // 8 pixel loop. 49686f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 49699d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "1: \n" 49701b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 49711c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com MEMOPREG(movdqa,0x00,0,1,1,xmm1) // movdqa (%0,%1,1),%%xmm1 49721b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 49739d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "movdqa %%xmm0,%%xmm2 \n" 49749d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "paddusb %%xmm1,%%xmm2 \n" 49759d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "movdqa %%xmm0,%%xmm3 \n" 49769d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm5,%%xmm3 \n" 49779d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpckhbw %%xmm5,%%xmm0 \n" 49789d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "movdqa %%xmm1,%%xmm4 \n" 49799d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklbw %%xmm2,%%xmm4 \n" 49809d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpckhbw %%xmm2,%%xmm1 \n" 49819d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "movdqa %%xmm4,%%xmm6 \n" 49829d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklwd %%xmm3,%%xmm6 \n" 49839d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpckhwd %%xmm3,%%xmm4 \n" 49849d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "movdqa %%xmm1,%%xmm7 \n" 49859d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpcklwd %%xmm0,%%xmm7 \n" 49869d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "punpckhwd %%xmm0,%%xmm1 \n" 49879d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "sub $0x10,%3 \n" 49881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm6," MEMACCESS(2) " \n" 49891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm4," MEMACCESS2(0x10,2) " \n" 49901b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm7," MEMACCESS2(0x20,2) " \n" 49911b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x30,2) " \n" 49921b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,2) ",%2 \n" 49939d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "jg 1b \n" 49949d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : "+r"(src_sobelx), // %0 49959d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(src_sobely), // %1 49969d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(dst_argb), // %2 49979d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com "+r"(width) // %3 49989d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : 49999d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com : "memory", "cc" 50001c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 50011c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com , "r14" 50021c710a06062e47934697ef83bd6538eb84dfc3f9nfullagar@google.com#endif 50039d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#if defined(__SSE2__) 50049d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 50059d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif 50069d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com ); 50079d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com} 50089d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com#endif // HAS_SOBELXYROW_SSE2 50099d48df9ac434cf036bd8ec648fc040756a382c60fbarchard@google.com 5010f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com#ifdef HAS_COMPUTECUMULATIVESUMROW_SSE2 5011f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com// Creates a table of cumulative sums where each value is a sum of all values 5012f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com// above and to the left of the value, inclusive of the value. 5013f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.comvoid ComputeCumulativeSumRow_SSE2(const uint8* row, int32* cumsum, 5014133adc46470722b24fdac30d7537d5009e61ef0cfbarchard@google.com const int32* previous_cumsum, int width) { 5015f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com asm volatile ( 5016f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "pxor %%xmm0,%%xmm0 \n" 5017f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "pxor %%xmm1,%%xmm1 \n" 5018f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "sub $0x4,%3 \n" 5019f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jl 49f \n" 5020f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "test $0xf,%1 \n" 5021f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jne 49f \n" 5022f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 5023f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com // 4 pixel loop \n" 50246f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5025f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "40: \n" 50261b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm2 \n" 50271b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 5028f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "movdqa %%xmm2,%%xmm4 \n" 5029f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "punpcklbw %%xmm1,%%xmm2 \n" 5030f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "movdqa %%xmm2,%%xmm3 \n" 5031f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "punpcklwd %%xmm1,%%xmm2 \n" 5032f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "punpckhwd %%xmm1,%%xmm3 \n" 5033f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "punpckhbw %%xmm1,%%xmm4 \n" 5034f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "movdqa %%xmm4,%%xmm5 \n" 5035f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "punpcklwd %%xmm1,%%xmm4 \n" 5036f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "punpckhwd %%xmm1,%%xmm5 \n" 5037f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm2,%%xmm0 \n" 50381b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(2) ",%%xmm2 \n" 5039f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm0,%%xmm2 \n" 5040f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm3,%%xmm0 \n" 50411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,2) ",%%xmm3 \n" 5042f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm0,%%xmm3 \n" 5043f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm4,%%xmm0 \n" 50441b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,2) ",%%xmm4 \n" 5045f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm0,%%xmm4 \n" 5046f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm5,%%xmm0 \n" 50471b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,2) ",%%xmm5 \n" 50481b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,2) ",%2 \n" 5049f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm0,%%xmm5 \n" 50501b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm2," MEMACCESS(1) " \n" 50511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm3," MEMACCESS2(0x10,1) " \n" 50521b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm4," MEMACCESS2(0x20,1) " \n" 50531b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm5," MEMACCESS2(0x30,1) " \n" 50541b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,1) ",%1 \n" 5055f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "sub $0x4,%3 \n" 5056f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jge 40b \n" 5057f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 5058f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "49: \n" 5059f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "add $0x3,%3 \n" 5060f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jl 19f \n" 5061f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 5062f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com // 1 pixel loop \n" 50636f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5064f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "10: \n" 50651b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd " MEMACCESS(0) ",%%xmm2 \n" 50661b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,0) ",%0 \n" 5067f38aefef4b66dc8ebe77ff37234be332731d47f6fbarchard@google.com "punpcklbw %%xmm1,%%xmm2 \n" 5068f38aefef4b66dc8ebe77ff37234be332731d47f6fbarchard@google.com "punpcklwd %%xmm1,%%xmm2 \n" 5069f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm2,%%xmm0 \n" 50701b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(2) ",%%xmm2 \n" 50711b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 5072f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "paddd %%xmm0,%%xmm2 \n" 50731b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm2," MEMACCESS(1) " \n" 50741b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5075f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "sub $0x1,%3 \n" 5076f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jge 10b \n" 5077f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 5078f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "19: \n" 5079f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com : "+r"(row), // %0 5080f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "+r"(cumsum), // %1 5081f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "+r"(previous_cumsum), // %2 5082f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "+r"(width) // %3 5083f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com : 5084f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com : "memory", "cc" 5085f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com#if defined(__SSE2__) 5086f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 5087f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com#endif 5088f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com ); 5089f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com} 5090f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com#endif // HAS_COMPUTECUMULATIVESUMROW_SSE2 5091f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 5092f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com#ifdef HAS_CUMULATIVESUMTOAVERAGEROW_SSE2 5093f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.comvoid CumulativeSumToAverageRow_SSE2(const int32* topleft, const int32* botleft, 5094f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com int width, int area, uint8* dst, 5095f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com int count) { 5096f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com asm volatile ( 5097c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com "movd %5,%%xmm5 \n" 5098c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com "cvtdq2ps %%xmm5,%%xmm5 \n" 5099c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com "rcpss %%xmm5,%%xmm4 \n" 5100f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "pshufd $0x0,%%xmm4,%%xmm4 \n" 5101f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "sub $0x4,%3 \n" 5102f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jl 49f \n" 5103ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "cmpl $0x80,%5 \n" 5104ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "ja 40f \n" 5105ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com 5106c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 5107c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com "pcmpeqb %%xmm6,%%xmm6 \n" 5108c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com "psrld $0x10,%%xmm6 \n" 5109c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com "cvtdq2ps %%xmm6,%%xmm6 \n" 5110c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com "addps %%xmm6,%%xmm5 \n" 5111ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "mulps %%xmm4,%%xmm5 \n" 5112ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "cvtps2dq %%xmm5,%%xmm5 \n" 5113ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "packssdw %%xmm5,%%xmm5 \n" 5114ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com 5115ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com // 4 pixel small loop \n" 51166f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5117ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "4: \n" 5118ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 5119ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 5120ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 5121ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm3 \n" 5122ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com BUNDLEALIGN 5123ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com MEMOPREG(psubd,0x00,0,4,4,xmm0) // psubd 0x00(%0,%4,4),%%xmm0 5124ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com MEMOPREG(psubd,0x10,0,4,4,xmm1) // psubd 0x10(%0,%4,4),%%xmm1 5125ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com MEMOPREG(psubd,0x20,0,4,4,xmm2) // psubd 0x20(%0,%4,4),%%xmm2 5126ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com MEMOPREG(psubd,0x30,0,4,4,xmm3) // psubd 0x30(%0,%4,4),%%xmm3 5127ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 5128ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "psubd " MEMACCESS(1) ",%%xmm0 \n" 5129ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "psubd " MEMACCESS2(0x10,1) ",%%xmm1 \n" 5130ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "psubd " MEMACCESS2(0x20,1) ",%%xmm2 \n" 5131ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "psubd " MEMACCESS2(0x30,1) ",%%xmm3 \n" 5132ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com BUNDLEALIGN 5133ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com MEMOPREG(paddd,0x00,1,4,4,xmm0) // paddd 0x00(%1,%4,4),%%xmm0 5134ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com MEMOPREG(paddd,0x10,1,4,4,xmm1) // paddd 0x10(%1,%4,4),%%xmm1 5135ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com MEMOPREG(paddd,0x20,1,4,4,xmm2) // paddd 0x20(%1,%4,4),%%xmm2 5136ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com MEMOPREG(paddd,0x30,1,4,4,xmm3) // paddd 0x30(%1,%4,4),%%xmm3 5137ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "lea " MEMLEA(0x40,1) ",%1 \n" 5138ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "packssdw %%xmm1,%%xmm0 \n" 5139ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "packssdw %%xmm3,%%xmm2 \n" 5140ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "pmulhuw %%xmm5,%%xmm0 \n" 5141ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "pmulhuw %%xmm5,%%xmm2 \n" 5142ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 5143ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "movdqu %%xmm0," MEMACCESS(2) " \n" 5144ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 5145ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "sub $0x4,%3 \n" 5146ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "jge 4b \n" 5147ed9ddc076536baacfe9b9883badd405600bc1eaefbarchard@google.com "jmp 49f \n" 5148f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 5149f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com // 4 pixel loop \n" 51506f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5151f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "40: \n" 51521b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 51531b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 51541b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x20,0) ",%%xmm2 \n" 51551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x30,0) ",%%xmm3 \n" 5156e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com BUNDLEALIGN 5157e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(psubd,0x00,0,4,4,xmm0) // psubd 0x00(%0,%4,4),%%xmm0 5158e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(psubd,0x10,0,4,4,xmm1) // psubd 0x10(%0,%4,4),%%xmm1 5159e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(psubd,0x20,0,4,4,xmm2) // psubd 0x20(%0,%4,4),%%xmm2 5160e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(psubd,0x30,0,4,4,xmm3) // psubd 0x30(%0,%4,4),%%xmm3 51611b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 51621b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "psubd " MEMACCESS(1) ",%%xmm0 \n" 51631b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "psubd " MEMACCESS2(0x10,1) ",%%xmm1 \n" 51641b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "psubd " MEMACCESS2(0x20,1) ",%%xmm2 \n" 51651b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "psubd " MEMACCESS2(0x30,1) ",%%xmm3 \n" 5166e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com BUNDLEALIGN 5167e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(paddd,0x00,1,4,4,xmm0) // paddd 0x00(%1,%4,4),%%xmm0 5168e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(paddd,0x10,1,4,4,xmm1) // paddd 0x10(%1,%4,4),%%xmm1 5169e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(paddd,0x20,1,4,4,xmm2) // paddd 0x20(%1,%4,4),%%xmm2 5170e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(paddd,0x30,1,4,4,xmm3) // paddd 0x30(%1,%4,4),%%xmm3 51711b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,1) ",%1 \n" 5172f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtdq2ps %%xmm0,%%xmm0 \n" 5173f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtdq2ps %%xmm1,%%xmm1 \n" 5174f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "mulps %%xmm4,%%xmm0 \n" 5175f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "mulps %%xmm4,%%xmm1 \n" 5176f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtdq2ps %%xmm2,%%xmm2 \n" 5177f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtdq2ps %%xmm3,%%xmm3 \n" 5178f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "mulps %%xmm4,%%xmm2 \n" 5179f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "mulps %%xmm4,%%xmm3 \n" 5180f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtps2dq %%xmm0,%%xmm0 \n" 5181f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtps2dq %%xmm1,%%xmm1 \n" 5182f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtps2dq %%xmm2,%%xmm2 \n" 5183f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtps2dq %%xmm3,%%xmm3 \n" 5184f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "packssdw %%xmm1,%%xmm0 \n" 5185f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "packssdw %%xmm3,%%xmm2 \n" 5186f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "packuswb %%xmm2,%%xmm0 \n" 51871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(2) " \n" 51881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 5189f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "sub $0x4,%3 \n" 5190f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jge 40b \n" 5191f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 5192f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "49: \n" 5193f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "add $0x3,%3 \n" 5194f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jl 19f \n" 5195f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 5196f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com // 1 pixel loop \n" 51976f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5198f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "10: \n" 51991b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 5200e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(psubd,0x00,0,4,4,xmm0) // psubd 0x00(%0,%4,4),%%xmm0 52011b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 52021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "psubd " MEMACCESS(1) ",%%xmm0 \n" 5203e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com BUNDLEALIGN 5204e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com MEMOPREG(paddd,0x00,1,4,4,xmm0) // paddd 0x00(%1,%4,4),%%xmm0 52051b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5206f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtdq2ps %%xmm0,%%xmm0 \n" 5207f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "mulps %%xmm4,%%xmm0 \n" 5208f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "cvtps2dq %%xmm0,%%xmm0 \n" 5209f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "packssdw %%xmm0,%%xmm0 \n" 5210f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 52111b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd %%xmm0," MEMACCESS(2) " \n" 52121b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,2) ",%2 \n" 5213f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "sub $0x1,%3 \n" 5214f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "jge 10b \n" 5215f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "19: \n" 5216f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com : "+r"(topleft), // %0 5217f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "+r"(botleft), // %1 5218f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "+r"(dst), // %2 5219f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "+rm"(count) // %3 5220a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(width)), // %4 5221f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com "rm"(area) // %5 5222f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com : "memory", "cc" 5223e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 5224e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com , "r14" 5225e9a27403d4a681ff92860044927a159bc60a8976nfullagar@google.com#endif 5226f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com#if defined(__SSE2__) 5227c2a889eb5513143c9207c702429100562b4001f7fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6" 5228f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com#endif 5229f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com ); 5230f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com} 5231f08ac6bb095348565b5259f2fab95f259ef47edefbarchard@google.com#endif // HAS_CUMULATIVESUMTOAVERAGEROW_SSE2 5232f51e87912eebc959ac6b9d1ab44978e0e056ca74fbarchard@google.com 52337344440fb22b65ec4915b6084963816404edc088fbarchard@google.com#ifdef HAS_ARGBAFFINEROW_SSE2 52347344440fb22b65ec4915b6084963816404edc088fbarchard@google.com// Copy ARGB pixels from source image with slope to a row of destination. 5235fc7314e86bc7a1a88b38b815e881183521801ea9fbarchard@google.comLIBYUV_API 52367344440fb22b65ec4915b6084963816404edc088fbarchard@google.comvoid ARGBAffineRow_SSE2(const uint8* src_argb, int src_argb_stride, 5237c1f17f1843aa84a1f23c2c17b24167e5066a9db9fbarchard@google.com uint8* dst_argb, const float* src_dudv, int width) { 52387344440fb22b65ec4915b6084963816404edc088fbarchard@google.com intptr_t src_argb_stride_temp = src_argb_stride; 5239e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com intptr_t temp = 0; 52407344440fb22b65ec4915b6084963816404edc088fbarchard@google.com asm volatile ( 52411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS(3) ",%%xmm2 \n" 52421b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS2(0x08,3) ",%%xmm7 \n" 52437344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "shl $0x10,%1 \n" 52447344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "add $0x4,%1 \n" 5245e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "movd %1,%%xmm5 \n" 5246e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "sub $0x4,%4 \n" 5247e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "jl 49f \n" 5248e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com 5249e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "pshufd $0x44,%%xmm7,%%xmm7 \n" 5250e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 52517344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "movdqa %%xmm2,%%xmm0 \n" 5252e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "addps %%xmm7,%%xmm0 \n" 52537344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "movlhps %%xmm0,%%xmm2 \n" 5254e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "movdqa %%xmm7,%%xmm4 \n" 5255e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "addps %%xmm4,%%xmm4 \n" 5256e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "movdqa %%xmm2,%%xmm3 \n" 5257e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "addps %%xmm4,%%xmm3 \n" 5258e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "addps %%xmm4,%%xmm4 \n" 52597344440fb22b65ec4915b6084963816404edc088fbarchard@google.com 5260e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com // 4 pixel loop \n" 52616f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5262e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "40: \n" 5263a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "cvttps2dq %%xmm2,%%xmm0 \n" // x, y float to int first 2 5264a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "cvttps2dq %%xmm3,%%xmm1 \n" // x, y float to int next 2 5265a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "packssdw %%xmm1,%%xmm0 \n" // x, y as 8 shorts 5266a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "pmaddwd %%xmm5,%%xmm0 \n" // off = x * 4 + y * stride 5267a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "movd %%xmm0,%k1 \n" 5268e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "pshufd $0x39,%%xmm0,%%xmm0 \n" 5269a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "movd %%xmm0,%k5 \n" 5270e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "pshufd $0x39,%%xmm0,%%xmm0 \n" 52716f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com BUNDLEALIGN 5272a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com MEMOPREG(movd,0x00,0,1,1,xmm1) // movd (%0,%1,1),%%xmm1 5273a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com MEMOPREG(movd,0x00,0,5,1,xmm6) // movd (%0,%5,1),%%xmm6 5274e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "punpckldq %%xmm6,%%xmm1 \n" 5275e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "addps %%xmm4,%%xmm2 \n" 52761b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm1," MEMACCESS(2) " \n" 5277a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "movd %%xmm0,%k1 \n" 5278e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "pshufd $0x39,%%xmm0,%%xmm0 \n" 5279a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "movd %%xmm0,%k5 \n" 52806f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com BUNDLEALIGN 5281a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com MEMOPREG(movd,0x00,0,1,1,xmm0) // movd (%0,%1,1),%%xmm0 5282a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com MEMOPREG(movd,0x00,0,5,1,xmm6) // movd (%0,%5,1),%%xmm6 5283e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "punpckldq %%xmm6,%%xmm0 \n" 5284e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "addps %%xmm4,%%xmm3 \n" 5285e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "sub $0x4,%4 \n" 52861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS2(0x08,2) " \n" 52871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 5288e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "jge 40b \n" 5289e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com 5290e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "49: \n" 5291e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "add $0x3,%4 \n" 52927344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "jl 19f \n" 52937344440fb22b65ec4915b6084963816404edc088fbarchard@google.com 52947344440fb22b65ec4915b6084963816404edc088fbarchard@google.com // 1 pixel loop \n" 52956f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 52967344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "10: \n" 5297e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "cvttps2dq %%xmm2,%%xmm0 \n" 5298e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "packssdw %%xmm0,%%xmm0 \n" 5299e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "pmaddwd %%xmm5,%%xmm0 \n" 5300e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "addps %%xmm7,%%xmm2 \n" 5301a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com "movd %%xmm0,%k1 \n" 53026f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com BUNDLEALIGN 5303a0630d77f0433f77eba221854b017d6c8bc5229afbarchard@google.com MEMOPREG(movd,0x00,0,1,1,xmm0) // movd (%0,%1,1),%%xmm0 53047344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "sub $0x1,%4 \n" 53051b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movd %%xmm0," MEMACCESS(2) " \n" 53061b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x04,2) ",%2 \n" 53077344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "jge 10b \n" 53087344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "19: \n" 53097344440fb22b65ec4915b6084963816404edc088fbarchard@google.com : "+r"(src_argb), // %0 53107344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "+r"(src_argb_stride_temp), // %1 53117344440fb22b65ec4915b6084963816404edc088fbarchard@google.com "+r"(dst_argb), // %2 5312b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "+r"(src_dudv), // %3 5313e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "+rm"(width), // %4 5314e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com "+r"(temp) // %5 53157344440fb22b65ec4915b6084963816404edc088fbarchard@google.com : 53167344440fb22b65ec4915b6084963816404edc088fbarchard@google.com : "memory", "cc" 53176f61eb67097b1602c957b5af87a4736e314d7e17fbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 53186f61eb67097b1602c957b5af87a4736e314d7e17fbarchard@google.com , "r14" 53196f61eb67097b1602c957b5af87a4736e314d7e17fbarchard@google.com#endif 53207344440fb22b65ec4915b6084963816404edc088fbarchard@google.com#if defined(__SSE2__) 5321e3cc76943e5d1963443ed323c0abd35bafeba945fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 53227344440fb22b65ec4915b6084963816404edc088fbarchard@google.com#endif 53237344440fb22b65ec4915b6084963816404edc088fbarchard@google.com ); 53247344440fb22b65ec4915b6084963816404edc088fbarchard@google.com} 53257344440fb22b65ec4915b6084963816404edc088fbarchard@google.com#endif // HAS_ARGBAFFINEROW_SSE2 53267344440fb22b65ec4915b6084963816404edc088fbarchard@google.com 5327abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#ifdef HAS_INTERPOLATEROW_SSSE3 5328b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com// Bilinear filter 16x2 -> 16x1 5329b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.comvoid InterpolateRow_SSSE3(uint8* dst_ptr, const uint8* src_ptr, 5330b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com ptrdiff_t src_stride, int dst_width, 5331b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com int source_y_fraction) { 53329bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com asm volatile ( 53339bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "sub %1,%0 \n" 53349bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "shr %3 \n" 53359bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "cmp $0x0,%3 \n" 5336b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "je 100f \n" 5337b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "cmp $0x20,%3 \n" 5338b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "je 75f \n" 53399bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "cmp $0x40,%3 \n" 5340b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "je 50f \n" 5341b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "cmp $0x60,%3 \n" 5342b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "je 25f \n" 5343b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com 53449bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "movd %3,%%xmm0 \n" 53459bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "neg %3 \n" 53469bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "add $0x80,%3 \n" 53479bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "movd %3,%%xmm5 \n" 53489bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "punpcklbw %%xmm0,%%xmm5 \n" 53499bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "punpcklwd %%xmm5,%%xmm5 \n" 53509bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 5351b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com 5352b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com // General purpose row blend. 53536f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 53549bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "1: \n" 53551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm0 \n" 53569b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPREG(movdqa,0x00,1,4,1,xmm2) 53579bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 53589bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "punpcklbw %%xmm2,%%xmm0 \n" 53599bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "punpckhbw %%xmm2,%%xmm1 \n" 53609bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "pmaddubsw %%xmm5,%%xmm0 \n" 53619bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "pmaddubsw %%xmm5,%%xmm1 \n" 53629bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "psrlw $0x7,%%xmm0 \n" 53639bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "psrlw $0x7,%%xmm1 \n" 53649bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 5365b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 53669b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com BUNDLEALIGN 53679b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) 53681b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 53699bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "jg 1b \n" 5370b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "jmp 99f \n" 5371b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com 5372b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com // Blend 25 / 75. 53736f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5374b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "25: \n" 53751b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm0 \n" 53769b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPREG(movdqa,0x00,1,4,1,xmm1) 5377b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5378b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5379b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 53809b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com BUNDLEALIGN 53819b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) 53821b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5383b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "jg 25b \n" 5384b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "jmp 99f \n" 5385b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com 5386b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com // Blend 50 / 50. 53876f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5388b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "50: \n" 53891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm0 \n" 53909b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPREG(movdqa,0x00,1,4,1,xmm1) 5391b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5392b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 53939b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com BUNDLEALIGN 53949b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) 53951b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5396b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "jg 50b \n" 5397b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "jmp 99f \n" 5398b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com 5399b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com // Blend 75 / 25. 54006f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5401b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "75: \n" 54021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm1 \n" 54039b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPREG(movdqa,0x00,1,4,1,xmm0) 5404b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5405b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5406b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 54079b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com BUNDLEALIGN 54089b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) 54091b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5410b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "jg 75b \n" 5411b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "jmp 99f \n" 5412b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com 5413b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com // Blend 100 / 0 - Copy row unchanged. 54146f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5415b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "100: \n" 54161b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm0 \n" 5417b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 54189b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) 54191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5420b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "jg 100b \n" 5421b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com 5422b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "99: \n" 5423b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com : "+r"(dst_ptr), // %0 5424b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "+r"(src_ptr), // %1 5425b5491759b45de37df781d4408a0c46abf6d4ae08fbarchard@google.com "+r"(dst_width), // %2 54269bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com "+r"(source_y_fraction) // %3 5427a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride)) // %4 54289bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com : "memory", "cc" 54299b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 54309b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com , "r14" 54319b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com#endif 54329bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com#if defined(__SSE2__) 54339bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm5" 54349bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com#endif 54359bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com ); 54369bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com} 5437abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#endif // HAS_INTERPOLATEROW_SSSE3 54389bcc9a25355841f844e9fae3ba40522447312a66fbarchard@google.com 543997c96261076adb3294105db38b461bcfae9597d3fbarchard@google.com#ifdef HAS_INTERPOLATEROW_SSE2 5440b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com// Bilinear filter 16x2 -> 16x1 5441b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.comvoid InterpolateRow_SSE2(uint8* dst_ptr, const uint8* src_ptr, 5442b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com ptrdiff_t src_stride, int dst_width, 5443b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com int source_y_fraction) { 5444af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com asm volatile ( 5445af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "sub %1,%0 \n" 5446af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "shr %3 \n" 5447af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "cmp $0x0,%3 \n" 5448af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "je 100f \n" 5449af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "cmp $0x20,%3 \n" 5450af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "je 75f \n" 5451af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "cmp $0x40,%3 \n" 5452af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "je 50f \n" 5453af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "cmp $0x60,%3 \n" 5454af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "je 25f \n" 5455af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com 5456af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "movd %3,%%xmm0 \n" 5457af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "neg %3 \n" 5458af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "add $0x80,%3 \n" 5459af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "movd %3,%%xmm5 \n" 5460af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "punpcklbw %%xmm0,%%xmm5 \n" 5461af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "punpcklwd %%xmm5,%%xmm5 \n" 5462af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 5463af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 5464af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com 5465af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com // General purpose row blend. 54666f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5467af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "1: \n" 54681b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm0 \n" 5469f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPREG(movdqa,0x00,1,4,1,xmm2) // movdqa (%1,%4,1),%%xmm2 5470af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 5471af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "movdqa %%xmm2,%%xmm3 \n" 5472af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "punpcklbw %%xmm4,%%xmm2 \n" 5473af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "punpckhbw %%xmm4,%%xmm3 \n" 5474af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "punpcklbw %%xmm4,%%xmm0 \n" 5475af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "punpckhbw %%xmm4,%%xmm1 \n" 5476af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "psubw %%xmm0,%%xmm2 \n" 5477af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "psubw %%xmm1,%%xmm3 \n" 5478af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "paddw %%xmm2,%%xmm2 \n" 5479af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "paddw %%xmm3,%%xmm3 \n" 5480af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pmulhw %%xmm5,%%xmm2 \n" 5481af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pmulhw %%xmm5,%%xmm3 \n" 5482af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "paddw %%xmm2,%%xmm0 \n" 5483af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "paddw %%xmm3,%%xmm1 \n" 5484af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 5485b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5486f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com BUNDLEALIGN 5487f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) // movdqa %%xmm0,(%1,%0,1) 54881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5489af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jg 1b \n" 5490af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jmp 99f \n" 5491af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com 5492af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com // Blend 25 / 75. 54936f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5494af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "25: \n" 54951b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm0 \n" 5496f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPREG(movdqa,0x00,1,4,1,xmm1) // movdqa (%1,%4,1),%%xmm1 5497af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5498af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5499b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5500f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com BUNDLEALIGN 5501f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) // movdqa %%xmm0,(%1,%0,1) 55021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5503af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jg 25b \n" 5504af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jmp 99f \n" 5505af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com 5506af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com // Blend 50 / 50. 55076f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5508af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "50: \n" 55091b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm0 \n" 5510f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPREG(movdqa,0x00,1,4,1,xmm1) // movdqa (%1,%4,1),%%xmm1 5511af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5512b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5513f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com BUNDLEALIGN 5514f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) // movdqa %%xmm0,(%1,%0,1) 55151b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5516af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jg 50b \n" 5517af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jmp 99f \n" 5518af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com 5519af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com // Blend 75 / 25. 55206f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5521af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "75: \n" 55221b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm1 \n" 5523f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPREG(movdqa,0x00,1,4,1,xmm0) // movdqa (%1,%4,1),%%xmm0 5524af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5525af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5526b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5527f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com BUNDLEALIGN 5528f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) // movdqa %%xmm0,(%1,%0,1) 55291b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5530af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jg 75b \n" 5531af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jmp 99f \n" 5532af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com 5533af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com // Blend 100 / 0 - Copy row unchanged. 55346f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5535af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "100: \n" 55361b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(1) ",%%xmm0 \n" 5537b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5538f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqa,xmm0,0x00,1,0,1) // movdqa %%xmm0,(%1,%0,1) 55391b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5540cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 100b \n" 5541cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5542cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "99: \n" 5543b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com : "+r"(dst_ptr), // %0 5544b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "+r"(src_ptr), // %1 5545cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "+r"(dst_width), // %2 5546cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "+r"(source_y_fraction) // %3 5547a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride)) // %4 5548cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com : "memory", "cc" 5549f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 5550f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com , "r14" 5551f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com#endif 5552cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com#if defined(__SSE2__) 5553cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 5554cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com#endif 5555cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com ); 5556cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com} 555797c96261076adb3294105db38b461bcfae9597d3fbarchard@google.com#endif // HAS_INTERPOLATEROW_SSE2 5558cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5559abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#ifdef HAS_INTERPOLATEROW_SSSE3 5560b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com// Bilinear filter 16x2 -> 16x1 5561b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.comvoid InterpolateRow_Unaligned_SSSE3(uint8* dst_ptr, const uint8* src_ptr, 5562b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com ptrdiff_t src_stride, int dst_width, 5563b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com int source_y_fraction) { 5564cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com asm volatile ( 5565cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "sub %1,%0 \n" 5566cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "shr %3 \n" 5567cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "cmp $0x0,%3 \n" 5568cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "je 100f \n" 5569cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "cmp $0x20,%3 \n" 5570cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "je 75f \n" 5571cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "cmp $0x40,%3 \n" 5572cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "je 50f \n" 5573cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "cmp $0x60,%3 \n" 5574cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "je 25f \n" 5575cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5576cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "movd %3,%%xmm0 \n" 5577cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "neg %3 \n" 5578cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "add $0x80,%3 \n" 5579cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "movd %3,%%xmm5 \n" 5580cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpcklbw %%xmm0,%%xmm5 \n" 5581cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpcklwd %%xmm5,%%xmm5 \n" 5582cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 5583cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5584cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // General purpose row blend. 55856f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5586cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "1: \n" 55871b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm0 \n" 55889b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPREG(movdqu,0x00,1,4,1,xmm2) 5589cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "movdqu %%xmm0,%%xmm1 \n" 5590cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpcklbw %%xmm2,%%xmm0 \n" 5591cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpckhbw %%xmm2,%%xmm1 \n" 5592cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pmaddubsw %%xmm5,%%xmm0 \n" 5593cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pmaddubsw %%xmm5,%%xmm1 \n" 5594cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "psrlw $0x7,%%xmm0 \n" 5595cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "psrlw $0x7,%%xmm1 \n" 5596cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 5597b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 55989b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com BUNDLEALIGN 55999b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) 56001b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5601cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 1b \n" 5602cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jmp 99f \n" 5603cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5604cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // Blend 25 / 75. 56056f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5606cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "25: \n" 56071b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm0 \n" 56089b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPREG(movdqu,0x00,1,4,1,xmm1) 5609cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5610cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5611b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 56129b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com BUNDLEALIGN 56139b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) 56141b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5615cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 25b \n" 5616cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jmp 99f \n" 5617cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5618cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // Blend 50 / 50. 56196f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5620cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "50: \n" 56211b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm0 \n" 56229b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPREG(movdqu,0x00,1,4,1,xmm1) 5623cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5624b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 56259b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com BUNDLEALIGN 56269b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) 56271b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5628cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 50b \n" 5629cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jmp 99f \n" 5630cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5631cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // Blend 75 / 25. 56326f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5633cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "75: \n" 56341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm1 \n" 56359b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPREG(movdqu,0x00,1,4,1,xmm0) 5636cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5637cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5638b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 56399b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com BUNDLEALIGN 56409b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) 56411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5642cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 75b \n" 5643cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jmp 99f \n" 5644cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5645cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // Blend 100 / 0 - Copy row unchanged. 56466f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5647cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "100: \n" 56481b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm0 \n" 5649b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 56509b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) 56511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5652cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 100b \n" 5653cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5654cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "99: \n" 5655b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com : "+r"(dst_ptr), // %0 5656b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "+r"(src_ptr), // %1 5657cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "+r"(dst_width), // %2 5658cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "+r"(source_y_fraction) // %3 5659a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride)) // %4 5660cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com : "memory", "cc" 56619b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 56629b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com , "r14" 56639b0f0da083b6a3a79dccc901048b473368bdbfd4nfullagar@google.com#endif 5664cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com#if defined(__SSE2__) 5665cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm5" 5666cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com#endif 5667cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com ); 5668cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com} 5669abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#endif // HAS_INTERPOLATEROW_SSSE3 5670cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 567197c96261076adb3294105db38b461bcfae9597d3fbarchard@google.com#ifdef HAS_INTERPOLATEROW_SSE2 5672b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com// Bilinear filter 16x2 -> 16x1 5673b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.comvoid InterpolateRow_Unaligned_SSE2(uint8* dst_ptr, const uint8* src_ptr, 5674b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com ptrdiff_t src_stride, int dst_width, 5675b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com int source_y_fraction) { 5676cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com asm volatile ( 5677cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "sub %1,%0 \n" 5678cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "shr %3 \n" 5679cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "cmp $0x0,%3 \n" 5680cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "je 100f \n" 5681cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "cmp $0x20,%3 \n" 5682cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "je 75f \n" 5683cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "cmp $0x40,%3 \n" 5684cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "je 50f \n" 5685cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "cmp $0x60,%3 \n" 5686cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "je 25f \n" 5687cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5688cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "movd %3,%%xmm0 \n" 5689cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "neg %3 \n" 5690cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "add $0x80,%3 \n" 5691cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "movd %3,%%xmm5 \n" 5692cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpcklbw %%xmm0,%%xmm5 \n" 5693cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpcklwd %%xmm5,%%xmm5 \n" 5694cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 5695cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pxor %%xmm4,%%xmm4 \n" 5696cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5697cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // General purpose row blend. 56986f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5699cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "1: \n" 57001b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm0 \n" 5701f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPREG(movdqu,0x00,1,4,1,xmm2) // movdqu (%1,%4,1),%%xmm2 5702cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "movdqu %%xmm0,%%xmm1 \n" 5703cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "movdqu %%xmm2,%%xmm3 \n" 5704cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpcklbw %%xmm4,%%xmm2 \n" 5705cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpckhbw %%xmm4,%%xmm3 \n" 5706cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpcklbw %%xmm4,%%xmm0 \n" 5707cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "punpckhbw %%xmm4,%%xmm1 \n" 5708cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "psubw %%xmm0,%%xmm2 \n" 5709cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "psubw %%xmm1,%%xmm3 \n" 5710cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "paddw %%xmm2,%%xmm2 \n" 5711cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "paddw %%xmm3,%%xmm3 \n" 5712cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pmulhw %%xmm5,%%xmm2 \n" 5713cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pmulhw %%xmm5,%%xmm3 \n" 5714cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "paddw %%xmm2,%%xmm0 \n" 5715cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "paddw %%xmm3,%%xmm1 \n" 5716cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 5717b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5718f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com BUNDLEALIGN 5719f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) // movdqu %%xmm0,(%1,%0,1) 57201b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5721cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 1b \n" 5722cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jmp 99f \n" 5723cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5724cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // Blend 25 / 75. 57256f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5726cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "25: \n" 57271b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm0 \n" 5728f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPREG(movdqu,0x00,1,4,1,xmm1) // movdqu (%1,%4,1),%%xmm1 5729cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5730cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5731b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5732f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com BUNDLEALIGN 5733f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) // movdqu %%xmm0,(%1,%0,1) 57341b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5735cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 25b \n" 5736cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jmp 99f \n" 5737cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5738cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // Blend 50 / 50. 57396f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5740cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "50: \n" 57411b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm0 \n" 5742f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPREG(movdqu,0x00,1,4,1,xmm1) // movdqu (%1,%4,1),%%xmm1 5743cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5744b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5745f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com BUNDLEALIGN 5746f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) // movdqu %%xmm0,(%1,%0,1) 57471b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5748cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 50b \n" 5749cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jmp 99f \n" 5750cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5751cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // Blend 75 / 25. 57526f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5753cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "75: \n" 57541b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm1 \n" 5755f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPREG(movdqu,0x00,1,4,1,xmm0) // movdqu (%1,%4,1),%%xmm0 5756cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5757cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "pavgb %%xmm1,%%xmm0 \n" 5758b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5759f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com BUNDLEALIGN 5760f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) // movdqu %%xmm0,(%1,%0,1) 57611b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5762cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jg 75b \n" 5763cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "jmp 99f \n" 5764cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com 5765cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com // Blend 100 / 0 - Copy row unchanged. 57666f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5767cd6056c01cec8de0431390933537c9b8458bd472fbarchard@google.com "100: \n" 57681b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(1) ",%%xmm0 \n" 5769b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "sub $0x10,%2 \n" 5770f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com MEMOPMEM(movdqu,xmm0,0x00,1,0,1) // movdqu %%xmm0,(%1,%0,1) 57711b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 5772af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "jg 100b \n" 5773af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com 5774af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "99: \n" 5775b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com : "+r"(dst_ptr), // %0 5776b911428afd3994f47e5780a80c876d05d1d4c590fbarchard@google.com "+r"(src_ptr), // %1 5777af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "+r"(dst_width), // %2 5778af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com "+r"(source_y_fraction) // %3 5779a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_stride)) // %4 5780af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com : "memory", "cc" 5781f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com#if defined(__native_client__) && defined(__x86_64__) 5782f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com , "r14" 5783f78509b3bef818ab9cbda152efc6a614aaa967a1nfullagar@google.com#endif 5784af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com#if defined(__SSE2__) 5785af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" 5786af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com#endif 5787af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com ); 5788af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com} 578997c96261076adb3294105db38b461bcfae9597d3fbarchard@google.com#endif // HAS_INTERPOLATEROW_SSE2 5790af137b61faa4c0786635ed7e447e065413e6f5b4fbarchard@google.com 5791abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#ifdef HAS_HALFROW_SSE2 5792e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.comvoid HalfRow_SSE2(const uint8* src_uv, int src_uv_stride, 5793e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com uint8* dst_uv, int pix) { 5794e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com asm volatile ( 57951096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "sub %0,%1 \n" 57966f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 57971096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "1: \n" 57981b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 57998b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com MEMOPREG(pavgb,0x00,0,3,1,xmm0) // pavgb (%0,%3),%%xmm0 58001096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "sub $0x10,%2 \n" 58018b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com MEMOPMEM(movdqa,xmm0,0x00,0,1,1) // movdqa %%xmm0,(%0,%1) 58021b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 58031096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "jg 1b \n" 5804e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com : "+r"(src_uv), // %0 5805e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "+r"(dst_uv), // %1 5806e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com "+r"(pix) // %2 5807a1f5254a955c5c32484b56822596a4e3368e8eb7fbarchard@google.com : "r"((intptr_t)(src_uv_stride)) // %3 5808e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com : "memory", "cc" 5809e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com#if defined(__SSE2__) 5810e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com , "xmm0" 5811e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com#endif 5812e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com ); 5813e91bdaca3674830570cbb2aaab6d5c939f56dee4fbarchard@google.com} 5814abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#endif // HAS_HALFROW_SSE2 58158d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com 5816abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#ifdef HAS_ARGBTOBAYERROW_SSSE3 58178d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.comvoid ARGBToBayerRow_SSSE3(const uint8* src_argb, uint8* dst_bayer, 58188d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com uint32 selector, int pix) { 58198d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com asm volatile ( 58209335518f4127167ee54b0872ab715c674be06005fbarchard@google.com // NaCL caveat - assumes movd is from GPR 58211096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "movd %3,%%xmm5 \n" 58221096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "pshufd $0x0,%%xmm5,%%xmm5 \n" 58236f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 58248d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "1: \n" 58251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 58261b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 58271b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 58281096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "pshufb %%xmm5,%%xmm0 \n" 5829e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com "pshufb %%xmm5,%%xmm1 \n" 5830a3be4704262d57a69670de7cd0ad502540721186fbarchard@google.com "punpckldq %%xmm1,%%xmm0 \n" 5831e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com "sub $0x8,%2 \n" 58321b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 58331b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 58341096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "jg 1b \n" 58358d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : "+r"(src_argb), // %0 58368d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "+r"(dst_bayer), // %1 58378d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com "+r"(pix) // %2 58388d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : "g"(selector) // %3 58398d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com : "memory", "cc" 58408d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#if defined(__SSE2__) 5841e8df16bd7c44e58ea925c51ea82a34144ada3956fbarchard@google.com , "xmm0", "xmm1", "xmm5" 58428d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com#endif 58438d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com ); 58448d37dd5c205216e0ad13c5091061908cb981c5f9fbarchard@google.com} 5845abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#endif // HAS_ARGBTOBAYERROW_SSSE3 58469de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com 584708b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com#ifdef HAS_ARGBTOBAYERGGROW_SSE2 584808b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.comvoid ARGBToBayerGGRow_SSE2(const uint8* src_argb, uint8* dst_bayer, 584908b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com uint32 selector, int pix) { 585008b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com asm volatile ( 585108b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "pcmpeqb %%xmm5,%%xmm5 \n" 585208b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "psrld $0x18,%%xmm5 \n" 58536f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 585408b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "1: \n" 585508b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 585608b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 585708b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 585808b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "psrld $0x8,%%xmm0 \n" 585908b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "psrld $0x8,%%xmm1 \n" 586008b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "pand %%xmm5,%%xmm0 \n" 586108b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "pand %%xmm5,%%xmm1 \n" 58624c736098d6c10a9b4f407b5350f8a0ba5848c22dfbarchard@google.com "packssdw %%xmm1,%%xmm0 \n" 586308b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 586408b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "sub $0x8,%2 \n" 586508b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 586608b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 586708b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "jg 1b \n" 586808b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com : "+r"(src_argb), // %0 586908b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "+r"(dst_bayer), // %1 587008b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com "+r"(pix) // %2 587108b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com : 587208b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com : "memory", "cc" 587308b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com#if defined(__SSE2__) 587408b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com , "xmm0", "xmm1", "xmm5" 587508b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com#endif 587608b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com ); 587708b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com} 587808b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com#endif // HAS_ARGBTOBAYERGGROW_SSE2 587908b24a4232600b2f9f21584f34f6868d8c15c215fbarchard@google.com 5880abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#ifdef HAS_ARGBSHUFFLEROW_SSSE3 58811096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com// For BGRAToARGB, ABGRToARGB, RGBAToARGB, and ARGBToRGBA. 58821096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.comvoid ARGBShuffleRow_SSSE3(const uint8* src_argb, uint8* dst_argb, 58831096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com const uint8* shuffler, int pix) { 58841096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com asm volatile ( 58851b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(3) ",%%xmm5 \n" 58866f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 58871096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "1: \n" 58881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(0) ",%%xmm0 \n" 58891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS2(0x10,0) ",%%xmm1 \n" 58901b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 58911096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "pshufb %%xmm5,%%xmm0 \n" 58921096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "pshufb %%xmm5,%%xmm1 \n" 58931096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "sub $0x8,%2 \n" 58941b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm0," MEMACCESS(1) " \n" 58951b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa %%xmm1," MEMACCESS2(0x10,1) " \n" 58961b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 58971096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "jg 1b \n" 58981096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com : "+r"(src_argb), // %0 58991096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "+r"(dst_argb), // %1 59001096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "+r"(pix) // %2 59011096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com : "r"(shuffler) // %3 59021096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com : "memory", "cc" 59031096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com#if defined(__SSE2__) 59041096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com , "xmm0", "xmm1", "xmm5" 59051096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com#endif 59061096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com ); 59071096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com} 59081096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com 59091096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.comvoid ARGBShuffleRow_Unaligned_SSSE3(const uint8* src_argb, uint8* dst_argb, 59101096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com const uint8* shuffler, int pix) { 59111096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com asm volatile ( 59121b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqa " MEMACCESS(3) ",%%xmm5 \n" 59136f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 59141096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "1: \n" 59151b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 59161b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS2(0x10,0) ",%%xmm1 \n" 59171b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,0) ",%0 \n" 59181096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "pshufb %%xmm5,%%xmm0 \n" 59191096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "pshufb %%xmm5,%%xmm1 \n" 59201096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "sub $0x8,%2 \n" 59211b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 59221b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,1) " \n" 59231b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x20,1) ",%1 \n" 59241096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "jg 1b \n" 59251096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com : "+r"(src_argb), // %0 59261096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "+r"(dst_argb), // %1 59271096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "+r"(pix) // %2 59281096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com : "r"(shuffler) // %3 59291096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com : "memory", "cc" 59301096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com#if defined(__SSE2__) 59311096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com , "xmm0", "xmm1", "xmm5" 59321096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com#endif 59331096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com ); 59341096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com} 5935abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#endif // HAS_ARGBSHUFFLEROW_SSSE3 59361096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com 5937b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com#ifdef HAS_ARGBSHUFFLEROW_AVX2 5938b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com// For BGRAToARGB, ABGRToARGB, RGBAToARGB, and ARGBToRGBA. 5939b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.comvoid ARGBShuffleRow_AVX2(const uint8* src_argb, uint8* dst_argb, 5940b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com const uint8* shuffler, int pix) { 5941b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com asm volatile ( 59421b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vbroadcastf128 " MEMACCESS(3) ",%%ymm5 \n" 59436f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5944b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com "1: \n" 59451b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vmovdqu " MEMACCESS(0) ",%%ymm0 \n" 59461b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vmovdqu " MEMACCESS2(0x20,0) ",%%ymm1 \n" 59471b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,0) ",%0 \n" 5948b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com "vpshufb %%ymm5,%%ymm0,%%ymm0 \n" 5949b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com "vpshufb %%ymm5,%%ymm1,%%ymm1 \n" 5950b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com "sub $0x10,%2 \n" 59511b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vmovdqu %%ymm0," MEMACCESS(1) " \n" 59521b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vmovdqu %%ymm1," MEMACCESS2(0x20,1) " \n" 59531b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x40,1) ",%1 \n" 5954b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com "jg 1b \n" 5955b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com : "+r"(src_argb), // %0 5956b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com "+r"(dst_argb), // %1 5957b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com "+r"(pix) // %2 5958b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com : "r"(shuffler) // %3 5959b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com : "memory", "cc" 5960b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com#if defined(__SSE2__) 5961b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com , "xmm0", "xmm1", "xmm5" 5962b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com#endif 5963b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com ); 5964b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com} 5965b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com#endif // HAS_ARGBSHUFFLEROW_AVX2 5966b99bcab7f77ebc724ed451c04e72b589a3d4acbbfbarchard@google.com 59678b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com#ifdef HAS_ARGBSHUFFLEROW_SSE2 59688b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com// For BGRAToARGB, ABGRToARGB, RGBAToARGB, and ARGBToRGBA. 59698b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.comvoid ARGBShuffleRow_SSE2(const uint8* src_argb, uint8* dst_argb, 59708b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com const uint8* shuffler, int pix) { 59718b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com uintptr_t pixel_temp = 0u; 59728b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com asm volatile ( 59738b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pxor %%xmm5,%%xmm5 \n" 59741b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mov " MEMACCESS(4) ",%k2 \n" 59758b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "cmp $0x3000102,%k2 \n" 59768b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "je 3012f \n" 59778b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "cmp $0x10203,%k2 \n" 59788b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "je 123f \n" 59798b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "cmp $0x30201,%k2 \n" 59808b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "je 321f \n" 59818b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "cmp $0x2010003,%k2 \n" 59828b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "je 2103f \n" 59838b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com 59846f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 5985e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "1: \n" 59861b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movzb " MEMACCESS(4) ",%2 \n" 59876f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,0,2,1,2) " \n" // movzb (%0,%2,1),%2 59881b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mov %b2," MEMACCESS(1) " \n" 59891b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movzb " MEMACCESS2(0x1,4) ",%2 \n" 59906f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,0,2,1,2) " \n" // movzb (%0,%2,1),%2 59911b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mov %b2," MEMACCESS2(0x1,1) " \n" 59928b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com BUNDLEALIGN 59931b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movzb " MEMACCESS2(0x2,4) ",%2 \n" 59946f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,0,2,1,2) " \n" // movzb (%0,%2,1),%2 59951b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mov %b2," MEMACCESS2(0x2,1) " \n" 59961b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movzb " MEMACCESS2(0x3,4) ",%2 \n" 59976f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,0,2,1,2) " \n" // movzb (%0,%2,1),%2 59981b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mov %b2," MEMACCESS2(0x3,1) " \n" 59991b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,0) ",%0 \n" 60001b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x4,1) ",%1 \n" 60018b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "sub $0x1,%3 \n" 60028b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jg 1b \n" 60038b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jmp 99f \n" 60048b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com 60056f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 60068b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "123: \n" 60071b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 60081b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 60098b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 60108b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 60118b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "punpckhbw %%xmm5,%%xmm1 \n" 60128b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshufhw $0x1b,%%xmm0,%%xmm0 \n" 60138b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshuflw $0x1b,%%xmm0,%%xmm0 \n" 60148b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshufhw $0x1b,%%xmm1,%%xmm1 \n" 60158b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshuflw $0x1b,%%xmm1,%%xmm1 \n" 60168b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 60178b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "sub $0x4,%3 \n" 60181b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 60191b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 60208b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jg 123b \n" 60218b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jmp 99f \n" 60228b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com 60236f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 60248b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "321: \n" 60251b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 60261b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 60278b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 60288b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 60298b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "punpckhbw %%xmm5,%%xmm1 \n" 60308b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshufhw $0x39,%%xmm0,%%xmm0 \n" 60318b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshuflw $0x39,%%xmm0,%%xmm0 \n" 60328b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshufhw $0x39,%%xmm1,%%xmm1 \n" 60338b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshuflw $0x39,%%xmm1,%%xmm1 \n" 60348b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 60358b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "sub $0x4,%3 \n" 60361b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 60371b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 60388b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jg 321b \n" 60398b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jmp 99f \n" 60408b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com 60416f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 60428b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "2103: \n" 60431b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 60441b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 60458b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 60468b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 60478b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "punpckhbw %%xmm5,%%xmm1 \n" 60488b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshufhw $0x93,%%xmm0,%%xmm0 \n" 60498b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshuflw $0x93,%%xmm0,%%xmm0 \n" 60508b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshufhw $0x93,%%xmm1,%%xmm1 \n" 60518b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshuflw $0x93,%%xmm1,%%xmm1 \n" 60528b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 60538b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "sub $0x4,%3 \n" 60541b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 60551b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 60568b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jg 2103b \n" 60578b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jmp 99f \n" 60588b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com 60596f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 60608b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "3012: \n" 60611b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 60621b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 60638b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 60648b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "punpcklbw %%xmm5,%%xmm0 \n" 60658b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "punpckhbw %%xmm5,%%xmm1 \n" 60668b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshufhw $0xc6,%%xmm0,%%xmm0 \n" 60678b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshuflw $0xc6,%%xmm0,%%xmm0 \n" 60688b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshufhw $0xc6,%%xmm1,%%xmm1 \n" 60698b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "pshuflw $0xc6,%%xmm1,%%xmm1 \n" 60708b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "packuswb %%xmm1,%%xmm0 \n" 60718b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "sub $0x4,%3 \n" 60721b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movdqu %%xmm0," MEMACCESS(1) " \n" 60731b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x10,1) ",%1 \n" 60748b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "jg 3012b \n" 60758b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com 60768b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "99: \n" 60778b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com : "+r"(src_argb), // %0 60788b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "+r"(dst_argb), // %1 60798b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "+d"(pixel_temp), // %2 60808b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com "+r"(pix) // %3 60818b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com : "r"(shuffler) // %4 60828b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com : "memory", "cc" 60838b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 60848b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com , "r14" 60858b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com#endif 60868b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com#if defined(__SSE2__) 60878b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com , "xmm0", "xmm1", "xmm5" 60888b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com#endif 60898b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com ); 60908b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com} 60918b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com#endif // HAS_ARGBSHUFFLEROW_SSE2 60928b0cdb4a6e3bc468b1901dcfff7acc93bbb6a981fbarchard@google.com 6093abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#ifdef HAS_I422TOYUY2ROW_SSE2 60949de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.comvoid I422ToYUY2Row_SSE2(const uint8* src_y, 60959de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com const uint8* src_u, 60969de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com const uint8* src_v, 60979de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com uint8* dst_frame, int width) { 60989de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com asm volatile ( 60991096543eaa1e596a93ba5d3863e637dc489e32ccfbarchard@google.com "sub %1,%2 \n" 61006f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 61019de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "1: \n" 610267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq " MEMACCESS(1) ",%%xmm2 \n" 610367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPREG(movq,0x00,1,2,1,xmm3) // movq (%1,%2,1),%%xmm3 610467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 61059de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "punpcklbw %%xmm3,%%xmm2 \n" 610667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 610767e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 610855c20a861e3a503839fd2007b302bc20c11d9460fbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 61099de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "punpcklbw %%xmm2,%%xmm0 \n" 61109de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "punpckhbw %%xmm2,%%xmm1 \n" 611167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm0," MEMACCESS(3) " \n" 611267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS2(0x10,3) " \n" 611367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,3) ",%3 \n" 61149de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "sub $0x10,%4 \n" 61159de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "jg 1b \n" 61169de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com : "+r"(src_y), // %0 61179de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "+r"(src_u), // %1 61189de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "+r"(src_v), // %2 61199de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "+r"(dst_frame), // %3 61209de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "+rm"(width) // %4 61219de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com : 61229de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com : "memory", "cc" 612367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 612467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 612567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 61269de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com#if defined(__SSE2__) 61279de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3" 61289de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com#endif 61299de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com ); 61309de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com} 6131abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#endif // HAS_I422TOYUY2ROW_SSE2 61329de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com 6133abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#ifdef HAS_I422TOUYVYROW_SSE2 61349de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.comvoid I422ToUYVYRow_SSE2(const uint8* src_y, 61359de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com const uint8* src_u, 61369de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com const uint8* src_v, 61379de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com uint8* dst_frame, int width) { 61389de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com asm volatile ( 61399de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "sub %1,%2 \n" 61406f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 61419de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "1: \n" 614267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movq " MEMACCESS(1) ",%%xmm2 \n" 614367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com MEMOPREG(movq,0x00,1,2,1,xmm3) // movq (%1,%2,1),%%xmm3 614467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 61459de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "punpcklbw %%xmm3,%%xmm2 \n" 614667e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu " MEMACCESS(0) ",%%xmm0 \n" 61479de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "movdqa %%xmm2,%%xmm1 \n" 614867e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x10,0) ",%0 \n" 61499de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "punpcklbw %%xmm0,%%xmm1 \n" 61509de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "punpckhbw %%xmm0,%%xmm2 \n" 615167e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm1," MEMACCESS(3) " \n" 615267e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "movdqu %%xmm2," MEMACCESS2(0x10,3) " \n" 615367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com "lea " MEMLEA(0x20,3) ",%3 \n" 61549de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "sub $0x10,%4 \n" 61559de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "jg 1b \n" 61569de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com : "+r"(src_y), // %0 61579de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "+r"(src_u), // %1 61589de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "+r"(src_v), // %2 61599de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "+r"(dst_frame), // %3 61609de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com "+rm"(width) // %4 61619de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com : 61629de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com : "memory", "cc" 616367e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#if defined(__native_client__) && defined(__x86_64__) 616467e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com , "r14" 616567e64196680c90f5814021c7faacaf3b592db9cbfbarchard@google.com#endif 61669de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com#if defined(__SSE2__) 61679de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3" 61689de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com#endif 61699de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com ); 61709de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com} 6171abfeea9b81084185b0d3abc8fe5b5c4f496a0c18fbarchard@google.com#endif // HAS_I422TOUYVYROW_SSE2 61729de8867ab636128ff667fdf50d3ede83e861d97afbarchard@google.com 6173c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com#ifdef HAS_ARGBPOLYNOMIALROW_SSE2 6174c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.comvoid ARGBPolynomialRow_SSE2(const uint8* src_argb, 6175c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com uint8* dst_argb, const float* poly, 6176c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com int width) { 6177c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com asm volatile ( 6178c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "pxor %%xmm3,%%xmm3 \n" 6179c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com 6180c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com // 2 pixel loop. 61816f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 6182c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "1: \n" 61831b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq " MEMACCESS(0) ",%%xmm0 \n" 61841b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 6185c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "punpcklbw %%xmm3,%%xmm0 \n" 6186c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "movdqa %%xmm0,%%xmm4 \n" 6187c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "punpcklwd %%xmm3,%%xmm0 \n" 6188c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "punpckhwd %%xmm3,%%xmm4 \n" 6189c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "cvtdq2ps %%xmm0,%%xmm0 \n" 6190c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "cvtdq2ps %%xmm4,%%xmm4 \n" 6191c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "movdqa %%xmm0,%%xmm1 \n" 6192c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "movdqa %%xmm4,%%xmm5 \n" 61931b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mulps " MEMACCESS2(0x10,3) ",%%xmm0 \n" 61941b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mulps " MEMACCESS2(0x10,3) ",%%xmm4 \n" 61951b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "addps " MEMACCESS(3) ",%%xmm0 \n" 61961b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "addps " MEMACCESS(3) ",%%xmm4 \n" 6197c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "movdqa %%xmm1,%%xmm2 \n" 6198c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "movdqa %%xmm5,%%xmm6 \n" 6199c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "mulps %%xmm1,%%xmm2 \n" 6200c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "mulps %%xmm5,%%xmm6 \n" 6201c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "mulps %%xmm2,%%xmm1 \n" 6202c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "mulps %%xmm6,%%xmm5 \n" 62031b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mulps " MEMACCESS2(0x20,3) ",%%xmm2 \n" 62041b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mulps " MEMACCESS2(0x20,3) ",%%xmm6 \n" 62051b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mulps " MEMACCESS2(0x30,3) ",%%xmm1 \n" 62061b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "mulps " MEMACCESS2(0x30,3) ",%%xmm5 \n" 6207c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "addps %%xmm2,%%xmm0 \n" 6208c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "addps %%xmm6,%%xmm4 \n" 6209c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "addps %%xmm1,%%xmm0 \n" 6210c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "addps %%xmm5,%%xmm4 \n" 6211c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "cvttps2dq %%xmm0,%%xmm0 \n" 6212c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "cvttps2dq %%xmm4,%%xmm4 \n" 6213c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "packuswb %%xmm4,%%xmm0 \n" 6214c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "packuswb %%xmm0,%%xmm0 \n" 6215c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "sub $0x2,%2 \n" 62161b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "movq %%xmm0," MEMACCESS(1) " \n" 62171b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 6218c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "jg 1b \n" 6219c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com : "+r"(src_argb), // %0 6220c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "+r"(dst_argb), // %1 6221c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com "+r"(width) // %2 6222c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com : "r"(poly) // %3 6223c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com : "memory", "cc" 6224c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com#if defined(__SSE2__) 6225c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6" 6226c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com#endif 6227c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com ); 6228c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com} 6229c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com#endif // HAS_ARGBPOLYNOMIALROW_SSE2 6230c3b04796c2c77e69f6bd7ca294825d31eae528bffbarchard@google.com 62313cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com#ifdef HAS_ARGBPOLYNOMIALROW_AVX2 62323cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.comvoid ARGBPolynomialRow_AVX2(const uint8* src_argb, 62333cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com uint8* dst_argb, const float* poly, 62343cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com int width) { 62353cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com asm volatile ( 62361b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vbroadcastf128 " MEMACCESS(3) ",%%ymm4 \n" 62371b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vbroadcastf128 " MEMACCESS2(0x10,3) ",%%ymm5 \n" 62381b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vbroadcastf128 " MEMACCESS2(0x20,3) ",%%ymm6 \n" 62391b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vbroadcastf128 " MEMACCESS2(0x30,3) ",%%ymm7 \n" 62403cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com 62413cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com // 2 pixel loop. 62426f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 62433cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "1: \n" 62441b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vpmovzxbd " MEMACCESS(0) ",%%ymm0 \n" // 2 ARGB pixels 62451b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,0) ",%0 \n" 62463cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vcvtdq2ps %%ymm0,%%ymm0 \n" // X 8 floats 62473cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vmulps %%ymm0,%%ymm0,%%ymm2 \n" // X * X 62483cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vmulps %%ymm7,%%ymm0,%%ymm3 \n" // C3 * X 62493cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vfmadd132ps %%ymm5,%%ymm4,%%ymm0 \n" // result = C0 + C1 * X 62503cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vfmadd231ps %%ymm6,%%ymm2,%%ymm0 \n" // result += C2 * X * X 62513cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vfmadd231ps %%ymm3,%%ymm2,%%ymm0 \n" // result += C3 * X * X * X 62523cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vcvttps2dq %%ymm0,%%ymm0 \n" 62533cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vpackusdw %%ymm0,%%ymm0,%%ymm0 \n" 62543cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vpermq $0xd8,%%ymm0,%%ymm0 \n" 62553cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vpackuswb %%xmm0,%%xmm0,%%xmm0 \n" 62563cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "sub $0x2,%2 \n" 62571b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "vmovq %%xmm0," MEMACCESS(1) " \n" 62581b2ff39cc8757eca0a6a5445d4a0582cb2e8a0a3fbarchard@google.com "lea " MEMLEA(0x8,1) ",%1 \n" 62593cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "jg 1b \n" 62603cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "vzeroupper \n" 62613cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com : "+r"(src_argb), // %0 62623cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "+r"(dst_argb), // %1 62633cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com "+r"(width) // %2 62643cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com : "r"(poly) // %3 62653cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com : "memory", "cc" 62663cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com#if defined(__SSE2__) 6267529558453f6d1f5b828cf79dc9c6020f6bd7164dfbarchard@google.com// TODO(fbarchard): declare ymm usage when applicable. 6268529558453f6d1f5b828cf79dc9c6020f6bd7164dfbarchard@google.com , "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" 62693cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com#endif 62703cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com ); 62713cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com} 62723cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com#endif // HAS_ARGBPOLYNOMIALROW_AVX2 62733cb6071cb9f4df703be38ef5d94749d2edbcf05afbarchard@google.com 6274a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com#ifdef HAS_ARGBCOLORTABLEROW_X86 6275a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com// Tranform ARGB pixels with color table. 6276a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.comvoid ARGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb, 6277a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com int width) { 6278a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com uintptr_t pixel_temp = 0u; 6279a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com asm volatile ( 6280a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com // 1 pixel loop. 62816f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 6282a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "1: \n" 6283e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS(0) ",%1 \n" 6284e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "lea " MEMLEA(0x4,0) ",%0 \n" 62856f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,3,1,4,1) " \n" // movzb (%3,%1,4),%1 6286e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b1," MEMACCESS2(-0x4,0) " \n" 6287e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(-0x3,0) ",%1 \n" 62886f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x01,3,1,4,1) " \n" // movzb 0x1(%3,%1,4),%1 6289e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b1," MEMACCESS2(-0x3,0) " \n" 6290e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(-0x2,0) ",%1 \n" 62916f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x02,3,1,4,1) " \n" // movzb 0x2(%3,%1,4),%1 6292e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b1," MEMACCESS2(-0x2,0) " \n" 6293e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(-0x1,0) ",%1 \n" 62946f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x03,3,1,4,1) " \n" // movzb 0x3(%3,%1,4),%1 6295e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b1," MEMACCESS2(-0x1,0) " \n" 6296a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "dec %2 \n" 6297a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "jg 1b \n" 6298a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com : "+r"(dst_argb), // %0 6299a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "+d"(pixel_temp), // %1 6300a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "+r"(width) // %2 6301a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com : "r"(table_argb) // %3 6302a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com : "memory", "cc"); 6303a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com} 6304a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com#endif // HAS_ARGBCOLORTABLEROW_X86 6305a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com 6306a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com#ifdef HAS_RGBCOLORTABLEROW_X86 6307a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com// Tranform RGB pixels with color table. 6308a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.comvoid RGBColorTableRow_X86(uint8* dst_argb, const uint8* table_argb, int width) { 63096f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com uintptr_t pixel_temp = 0u; 6310a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com asm volatile ( 6311a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com // 1 pixel loop. 63126f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 6313a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "1: \n" 6314e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS(0) ",%1 \n" 6315e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "lea " MEMLEA(0x4,0) ",%0 \n" 63166f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,3,1,4,1) " \n" // movzb (%3,%1,4),%1 6317e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b1," MEMACCESS2(-0x4,0) " \n" 6318e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(-0x3,0) ",%1 \n" 63196f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x01,3,1,4,1) " \n" // movzb 0x1(%3,%1,4),%1 6320e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b1," MEMACCESS2(-0x3,0) " \n" 6321e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(-0x2,0) ",%1 \n" 63226f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x02,3,1,4,1) " \n" // movzb 0x2(%3,%1,4),%1 6323e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b1," MEMACCESS2(-0x2,0) " \n" 6324a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "dec %2 \n" 6325a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "jg 1b \n" 6326a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com : "+r"(dst_argb), // %0 6327a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "+d"(pixel_temp), // %1 6328a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com "+r"(width) // %2 6329a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com : "r"(table_argb) // %3 6330a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com : "memory", "cc"); 6331a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com} 6332a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com#endif // HAS_RGBCOLORTABLEROW_X86 6333a1ab194545697f18b16778781451e8f301acbbf9fbarchard@google.com 63346f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com#ifdef HAS_ARGBLUMACOLORTABLEROW_SSSE3 63356f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com// Tranform RGB pixels with luma table. 633611a0d48e45a7acd5aaf6b914caeee06432f06b6bfbarchard@google.comvoid ARGBLumaColorTableRow_SSSE3(const uint8* src_argb, uint8* dst_argb, 633711a0d48e45a7acd5aaf6b914caeee06432f06b6bfbarchard@google.com int width, 633811a0d48e45a7acd5aaf6b914caeee06432f06b6bfbarchard@google.com const uint8* luma, uint32 lumacoeff) { 63396f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com uintptr_t pixel_temp = 0u; 63406f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com uintptr_t table_temp = 0u; 63416f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com asm volatile ( 634211a0d48e45a7acd5aaf6b914caeee06432f06b6bfbarchard@google.com "movd %6,%%xmm3 \n" 634321796c94aa3a448a839e6a18aad060f018958156fbarchard@google.com "pshufd $0x0,%%xmm3,%%xmm3 \n" 63446f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "pcmpeqb %%xmm4,%%xmm4 \n" 63456f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "psllw $0x8,%%xmm4 \n" 63466f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "pxor %%xmm5,%%xmm5 \n" 63476f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 63486f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com // 4 pixel loop. 63496f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com LABELALIGN 63506f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "1: \n" 6351e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movdqu " MEMACCESS(2) ",%%xmm0 \n" 63526f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "pmaddubsw %%xmm3,%%xmm0 \n" 63536f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "phaddw %%xmm0,%%xmm0 \n" 63546f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "pand %%xmm4,%%xmm0 \n" 63556f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "punpcklwd %%xmm5,%%xmm0 \n" 63566f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "movd %%xmm0,%k1 \n" // 32 bit offset 63576f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "add %5,%1 \n" 63586f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "pshufd $0x39,%%xmm0,%%xmm0 \n" 63596f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 6360e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS(2) ",%0 \n" 63616f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6362e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS(3) " \n" 6363e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x1,2) ",%0 \n" 63646f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6365e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x1,3) " \n" 6366e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x2,2) ",%0 \n" 63676f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6368e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x2,3) " \n" 6369e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x3,2) ",%0 \n" 6370e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x3,3) " \n" 63716f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 63726f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "movd %%xmm0,%k1 \n" // 32 bit offset 63736f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "add %5,%1 \n" 63746f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "pshufd $0x39,%%xmm0,%%xmm0 \n" 63756f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 6376e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x4,2) ",%0 \n" 63776f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6378e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x4,3) " \n" 6379e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com BUNDLEALIGN 6380e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x5,2) ",%0 \n" 63816f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6382e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x5,3) " \n" 6383e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x6,2) ",%0 \n" 63846f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6385e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x6,3) " \n" 6386e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x7,2) ",%0 \n" 6387e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x7,3) " \n" 63886f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 63896f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "movd %%xmm0,%k1 \n" // 32 bit offset 63906f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "add %5,%1 \n" 63916f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "pshufd $0x39,%%xmm0,%%xmm0 \n" 63926f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 6393e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x8,2) ",%0 \n" 63946f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6395e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x8,3) " \n" 6396e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0x9,2) ",%0 \n" 63976f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6398e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0x9,3) " \n" 6399e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0xa,2) ",%0 \n" 64006f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6401e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0xa,3) " \n" 6402e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0xb,2) ",%0 \n" 6403e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0xb,3) " \n" 64046f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 64056f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "movd %%xmm0,%k1 \n" // 32 bit offset 64066f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "add %5,%1 \n" 64076f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 6408e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0xc,2) ",%0 \n" 64096f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6410e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0xc,3) " \n" 6411e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0xd,2) ",%0 \n" 64126f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6413e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0xd,3) " \n" 6414e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0xe,2) ",%0 \n" 64156f0a1dca2c2756743f3524f08a635a4124b82e80nfullagar@google.com MEMOPARG(movzb,0x00,1,0,1,0) " \n" // movzb (%1,%0,1),%0 6416e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0xe,3) " \n" 6417e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "movzb " MEMACCESS2(0xf,2) ",%0 \n" 6418e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "mov %b0," MEMACCESS2(0xf,3) " \n" 64196f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "sub $0x4,%4 \n" 6420e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "lea " MEMLEA(0x10,2) ",%2 \n" 6421e37aed6f422fe326395f5cd419f44874bf9ca939fbarchard@google.com "lea " MEMLEA(0x10,3) ",%3 \n" 64226f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "jg 1b \n" 64236f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com : "+d"(pixel_temp), // %0 6424407c4ee73a99b3909ccf948d8b0f94f32068d338fbarchard@google.com "+a"(table_temp), // %1 64256f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "+r"(src_argb), // %2 64266f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "+r"(dst_argb), // %3 64276f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com "+rm"(width) // %4 642811a0d48e45a7acd5aaf6b914caeee06432f06b6bfbarchard@google.com : "r"(luma), // %5 642911a0d48e45a7acd5aaf6b914caeee06432f06b6bfbarchard@google.com "rm"(lumacoeff) // %6 6430407c4ee73a99b3909ccf948d8b0f94f32068d338fbarchard@google.com : "memory", "cc" 6431407c4ee73a99b3909ccf948d8b0f94f32068d338fbarchard@google.com#if defined(__SSE2__) 6432407c4ee73a99b3909ccf948d8b0f94f32068d338fbarchard@google.com , "xmm0", "xmm3", "xmm4", "xmm5" 6433407c4ee73a99b3909ccf948d8b0f94f32068d338fbarchard@google.com#endif 6434407c4ee73a99b3909ccf948d8b0f94f32068d338fbarchard@google.com ); 64356f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com} 64366f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com#endif // HAS_ARGBLUMACOLORTABLEROW_SSSE3 64376f7e514caa3e1c57ab1fd765151c52b9156113befbarchard@google.com 64382d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com#endif // defined(__x86_64__) || defined(__i386__) 64392d11d43a6e21865b904705acce6535ae4c2d3caffbarchard@google.com 6440fe5ff7ed5451496281697bda9cb85084c532926cfbarchard@google.com#ifdef __cplusplus 6441aed1cc94c105736a5e6010e9c84cc32910b865d6mikhal@webrtc.org} // extern "C" 6442fe5ff7ed5451496281697bda9cb85084c532926cfbarchard@google.com} // namespace libyuv 6443fe5ff7ed5451496281697bda9cb85084c532926cfbarchard@google.com#endif 6444