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