blob: 97ef8441736272bcf2b9dea3de38d2f7c71d1b97 [file] [log] [blame]
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +00001/*
2 * Copyright 2012 The LibYuv Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
fbarchard@google.comcde58702013-01-28 00:02:35 +00007 * in the file PATENTS. All contributing project authors may
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +00008 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "libyuv/row.h"
12
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000013#include "libyuv/basic_types.h"
14
15#ifdef __cplusplus
16namespace libyuv {
17extern "C" {
18#endif
19
fbarchard@google.com522d7572012-11-09 23:14:57 +000020// TODO(fbarchard): Consider 'any' functions handling any quantity of pixels.
21// TODO(fbarchard): Consider 'any' functions handling odd alignment.
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000022// YUV to RGB does multiple of 8 with SIMD and remainder with C.
23#define YANY(NAMEANY, I420TORGB_SIMD, I420TORGB_C, UV_SHIFT, BPP, MASK) \
24 void NAMEANY(const uint8* y_buf, \
25 const uint8* u_buf, \
26 const uint8* v_buf, \
27 uint8* rgb_buf, \
28 int width) { \
29 int n = width & ~MASK; \
30 I420TORGB_SIMD(y_buf, u_buf, v_buf, rgb_buf, n); \
31 I420TORGB_C(y_buf + n, \
32 u_buf + (n >> UV_SHIFT), \
33 v_buf + (n >> UV_SHIFT), \
34 rgb_buf + n * BPP, width & MASK); \
35 }
36
37#ifdef HAS_I422TOARGBROW_SSSE3
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000038YANY(I422ToARGBRow_Any_SSSE3, I422ToARGBRow_Unaligned_SSSE3, I422ToARGBRow_C,
39 1, 4, 7)
fbarchard@google.come6dd1fa2014-06-24 20:45:45 +000040#endif // HAS_I422TOARGBROW_SSSE3
41#ifdef HAS_I444TOARGBROW_SSSE3
42YANY(I444ToARGBRow_Any_SSSE3, I444ToARGBRow_Unaligned_SSSE3, I444ToARGBRow_C,
43 0, 4, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000044YANY(I411ToARGBRow_Any_SSSE3, I411ToARGBRow_Unaligned_SSSE3, I411ToARGBRow_C,
45 2, 4, 7)
46YANY(I422ToBGRARow_Any_SSSE3, I422ToBGRARow_Unaligned_SSSE3, I422ToBGRARow_C,
47 1, 4, 7)
48YANY(I422ToABGRRow_Any_SSSE3, I422ToABGRRow_Unaligned_SSSE3, I422ToABGRRow_C,
49 1, 4, 7)
50YANY(I422ToRGBARow_Any_SSSE3, I422ToRGBARow_Unaligned_SSSE3, I422ToRGBARow_C,
51 1, 4, 7)
fbarchard@google.comaf1aa562012-10-30 21:11:54 +000052// I422ToRGB565Row_SSSE3 is unaligned.
53YANY(I422ToARGB4444Row_Any_SSSE3, I422ToARGB4444Row_SSSE3, I422ToARGB4444Row_C,
54 1, 2, 7)
55YANY(I422ToARGB1555Row_Any_SSSE3, I422ToARGB1555Row_SSSE3, I422ToARGB1555Row_C,
56 1, 2, 7)
57YANY(I422ToRGB565Row_Any_SSSE3, I422ToRGB565Row_SSSE3, I422ToRGB565Row_C,
58 1, 2, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000059// I422ToRGB24Row_SSSE3 is unaligned.
60YANY(I422ToRGB24Row_Any_SSSE3, I422ToRGB24Row_SSSE3, I422ToRGB24Row_C, 1, 3, 7)
61YANY(I422ToRAWRow_Any_SSSE3, I422ToRAWRow_SSSE3, I422ToRAWRow_C, 1, 3, 7)
62YANY(I422ToYUY2Row_Any_SSE2, I422ToYUY2Row_SSE2, I422ToYUY2Row_C, 1, 2, 15)
63YANY(I422ToUYVYRow_Any_SSE2, I422ToUYVYRow_SSE2, I422ToUYVYRow_C, 1, 2, 15)
fbarchard@google.come6dd1fa2014-06-24 20:45:45 +000064#endif // HAS_I444TOARGBROW_SSSE3
fbarchard@google.comc297d102013-04-12 07:26:24 +000065#ifdef HAS_I422TOARGBROW_AVX2
66YANY(I422ToARGBRow_Any_AVX2, I422ToARGBRow_AVX2, I422ToARGBRow_C, 1, 4, 15)
67#endif // HAS_I422TOARGBROW_AVX2
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000068#ifdef HAS_I422TOARGBROW_NEON
fbarchard@google.comb883ce62012-11-02 21:37:41 +000069YANY(I444ToARGBRow_Any_NEON, I444ToARGBRow_NEON, I444ToARGBRow_C, 0, 4, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000070YANY(I422ToARGBRow_Any_NEON, I422ToARGBRow_NEON, I422ToARGBRow_C, 1, 4, 7)
fbarchard@google.comb883ce62012-11-02 21:37:41 +000071YANY(I411ToARGBRow_Any_NEON, I411ToARGBRow_NEON, I411ToARGBRow_C, 2, 4, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000072YANY(I422ToBGRARow_Any_NEON, I422ToBGRARow_NEON, I422ToBGRARow_C, 1, 4, 7)
73YANY(I422ToABGRRow_Any_NEON, I422ToABGRRow_NEON, I422ToABGRRow_C, 1, 4, 7)
74YANY(I422ToRGBARow_Any_NEON, I422ToRGBARow_NEON, I422ToRGBARow_C, 1, 4, 7)
75YANY(I422ToRGB24Row_Any_NEON, I422ToRGB24Row_NEON, I422ToRGB24Row_C, 1, 3, 7)
76YANY(I422ToRAWRow_Any_NEON, I422ToRAWRow_NEON, I422ToRAWRow_C, 1, 3, 7)
fbarchard@google.comaf1aa562012-10-30 21:11:54 +000077YANY(I422ToARGB4444Row_Any_NEON, I422ToARGB4444Row_NEON, I422ToARGB4444Row_C,
78 1, 2, 7)
79YANY(I422ToARGB1555Row_Any_NEON, I422ToARGB1555Row_NEON, I422ToARGB1555Row_C,
80 1, 2, 7)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +000081YANY(I422ToRGB565Row_Any_NEON, I422ToRGB565Row_NEON, I422ToRGB565Row_C, 1, 2, 7)
82YANY(I422ToYUY2Row_Any_NEON, I422ToYUY2Row_NEON, I422ToYUY2Row_C, 1, 2, 15)
83YANY(I422ToUYVYRow_Any_NEON, I422ToUYVYRow_NEON, I422ToUYVYRow_C, 1, 2, 15)
84#endif // HAS_I422TOARGBROW_NEON
85#undef YANY
86
87// Wrappers to handle odd width
88#define NV2NY(NAMEANY, NV12TORGB_SIMD, NV12TORGB_C, UV_SHIFT, BPP) \
89 void NAMEANY(const uint8* y_buf, \
90 const uint8* uv_buf, \
91 uint8* rgb_buf, \
92 int width) { \
93 int n = width & ~7; \
94 NV12TORGB_SIMD(y_buf, uv_buf, rgb_buf, n); \
95 NV12TORGB_C(y_buf + n, \
96 uv_buf + (n >> UV_SHIFT), \
97 rgb_buf + n * BPP, width & 7); \
98 }
99
fbarchard@google.com9f2d4042012-10-31 18:36:28 +0000100#ifdef HAS_NV12TOARGBROW_SSSE3
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000101NV2NY(NV12ToARGBRow_Any_SSSE3, NV12ToARGBRow_Unaligned_SSSE3, NV12ToARGBRow_C,
fbarchard@google.com9f2d4042012-10-31 18:36:28 +0000102 0, 4)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000103NV2NY(NV21ToARGBRow_Any_SSSE3, NV21ToARGBRow_Unaligned_SSSE3, NV21ToARGBRow_C,
fbarchard@google.com9f2d4042012-10-31 18:36:28 +0000104 0, 4)
105#endif // HAS_NV12TOARGBROW_SSSE3
106#ifdef HAS_NV12TOARGBROW_NEON
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000107NV2NY(NV12ToARGBRow_Any_NEON, NV12ToARGBRow_NEON, NV12ToARGBRow_C, 0, 4)
108NV2NY(NV21ToARGBRow_Any_NEON, NV21ToARGBRow_NEON, NV21ToARGBRow_C, 0, 4)
fbarchard@google.com9f2d4042012-10-31 18:36:28 +0000109#endif // HAS_NV12TOARGBROW_NEON
110#ifdef HAS_NV12TORGB565ROW_SSSE3
111NV2NY(NV12ToRGB565Row_Any_SSSE3, NV12ToRGB565Row_SSSE3, NV12ToRGB565Row_C,
112 0, 2)
113NV2NY(NV21ToRGB565Row_Any_SSSE3, NV21ToRGB565Row_SSSE3, NV21ToRGB565Row_C,
114 0, 2)
115#endif // HAS_NV12TORGB565ROW_SSSE3
116#ifdef HAS_NV12TORGB565ROW_NEON
117NV2NY(NV12ToRGB565Row_Any_NEON, NV12ToRGB565Row_NEON, NV12ToRGB565Row_C, 0, 2)
118NV2NY(NV21ToRGB565Row_Any_NEON, NV21ToRGB565Row_NEON, NV21ToRGB565Row_C, 0, 2)
119#endif // HAS_NV12TORGB565ROW_NEON
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000120#undef NVANY
121
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000122#define RGBANY(NAMEANY, ARGBTORGB_SIMD, ARGBTORGB_C, MASK, SBPP, BPP) \
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000123 void NAMEANY(const uint8* src, \
124 uint8* dst, \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000125 int width) { \
126 int n = width & ~MASK; \
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000127 ARGBTORGB_SIMD(src, dst, n); \
128 ARGBTORGB_C(src + n * SBPP, dst + n * BPP, width & MASK); \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000129 }
130
131#if defined(HAS_ARGBTORGB24ROW_SSSE3)
132RGBANY(ARGBToRGB24Row_Any_SSSE3, ARGBToRGB24Row_SSSE3, ARGBToRGB24Row_C,
133 15, 4, 3)
134RGBANY(ARGBToRAWRow_Any_SSSE3, ARGBToRAWRow_SSSE3, ARGBToRAWRow_C,
135 15, 4, 3)
136RGBANY(ARGBToRGB565Row_Any_SSE2, ARGBToRGB565Row_SSE2, ARGBToRGB565Row_C,
137 3, 4, 2)
138RGBANY(ARGBToARGB1555Row_Any_SSE2, ARGBToARGB1555Row_SSE2, ARGBToARGB1555Row_C,
139 3, 4, 2)
140RGBANY(ARGBToARGB4444Row_Any_SSE2, ARGBToARGB4444Row_SSE2, ARGBToARGB4444Row_C,
141 3, 4, 2)
fbarchard@google.com7fa21d62013-08-13 21:54:23 +0000142#endif
143#if defined(HAS_I400TOARGBROW_SSE2)
fbarchard@google.com00b69a22012-11-02 06:03:28 +0000144RGBANY(I400ToARGBRow_Any_SSE2, I400ToARGBRow_Unaligned_SSE2, I400ToARGBRow_C,
145 7, 1, 4)
fbarchard@google.com7fa21d62013-08-13 21:54:23 +0000146#endif
147#if defined(HAS_YTOARGBROW_SSE2)
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000148RGBANY(YToARGBRow_Any_SSE2, YToARGBRow_SSE2, YToARGBRow_C,
149 7, 1, 4)
fbarchard@google.com793e5a02012-11-03 15:12:48 +0000150RGBANY(YUY2ToARGBRow_Any_SSSE3, YUY2ToARGBRow_Unaligned_SSSE3, YUY2ToARGBRow_C,
fbarchard@google.comf1daa3d2012-11-07 08:27:24 +0000151 15, 2, 4)
fbarchard@google.com793e5a02012-11-03 15:12:48 +0000152RGBANY(UYVYToARGBRow_Any_SSSE3, UYVYToARGBRow_Unaligned_SSSE3, UYVYToARGBRow_C,
fbarchard@google.comf1daa3d2012-11-07 08:27:24 +0000153 15, 2, 4)
fbarchard@google.com518833b2013-03-12 21:44:56 +0000154// These require alignment on ARGB, so C is used for remainder.
155RGBANY(RGB24ToARGBRow_Any_SSSE3, RGB24ToARGBRow_SSSE3, RGB24ToARGBRow_C,
156 15, 3, 4)
fbarchard@google.coma3956fc2013-03-12 23:22:32 +0000157RGBANY(RAWToARGBRow_Any_SSSE3, RAWToARGBRow_SSSE3, RAWToARGBRow_C,
fbarchard@google.com518833b2013-03-12 21:44:56 +0000158 15, 3, 4)
159RGBANY(RGB565ToARGBRow_Any_SSE2, RGB565ToARGBRow_SSE2, RGB565ToARGBRow_C,
160 7, 2, 4)
161RGBANY(ARGB1555ToARGBRow_Any_SSE2, ARGB1555ToARGBRow_SSE2, ARGB1555ToARGBRow_C,
162 7, 2, 4)
163RGBANY(ARGB4444ToARGBRow_Any_SSE2, ARGB4444ToARGBRow_SSE2, ARGB4444ToARGBRow_C,
164 7, 2, 4)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000165#endif
166#if defined(HAS_ARGBTORGB24ROW_NEON)
167RGBANY(ARGBToRGB24Row_Any_NEON, ARGBToRGB24Row_NEON, ARGBToRGB24Row_C, 7, 4, 3)
168RGBANY(ARGBToRAWRow_Any_NEON, ARGBToRAWRow_NEON, ARGBToRAWRow_C, 7, 4, 3)
169RGBANY(ARGBToRGB565Row_Any_NEON, ARGBToRGB565Row_NEON, ARGBToRGB565Row_C,
170 7, 4, 2)
171RGBANY(ARGBToARGB1555Row_Any_NEON, ARGBToARGB1555Row_NEON, ARGBToARGB1555Row_C,
172 7, 4, 2)
173RGBANY(ARGBToARGB4444Row_Any_NEON, ARGBToARGB4444Row_NEON, ARGBToARGB4444Row_C,
174 7, 4, 2)
fbarchard@google.com00b69a22012-11-02 06:03:28 +0000175RGBANY(I400ToARGBRow_Any_NEON, I400ToARGBRow_NEON, I400ToARGBRow_C,
176 7, 1, 4)
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000177RGBANY(YToARGBRow_Any_NEON, YToARGBRow_NEON, YToARGBRow_C,
178 7, 1, 4)
fbarchard@google.com793e5a02012-11-03 15:12:48 +0000179RGBANY(YUY2ToARGBRow_Any_NEON, YUY2ToARGBRow_NEON, YUY2ToARGBRow_C,
180 7, 2, 4)
181RGBANY(UYVYToARGBRow_Any_NEON, UYVYToARGBRow_NEON, UYVYToARGBRow_C,
182 7, 2, 4)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000183#endif
184#undef RGBANY
185
fbarchard@google.com522d7572012-11-09 23:14:57 +0000186// ARGB to Bayer does multiple of 4 pixels, SSSE3 aligned src, unaligned dst.
187#define BAYERANY(NAMEANY, ARGBTORGB_SIMD, ARGBTORGB_C, MASK, SBPP, BPP) \
188 void NAMEANY(const uint8* src, \
189 uint8* dst, uint32 selector, \
190 int width) { \
191 int n = width & ~MASK; \
192 ARGBTORGB_SIMD(src, dst, selector, n); \
193 ARGBTORGB_C(src + n * SBPP, dst + n * BPP, selector, width & MASK); \
194 }
195
196#if defined(HAS_ARGBTOBAYERROW_SSSE3)
197BAYERANY(ARGBToBayerRow_Any_SSSE3, ARGBToBayerRow_SSSE3, ARGBToBayerRow_C,
fbarchard@google.come8df16b2013-03-22 04:47:14 +0000198 7, 4, 1)
fbarchard@google.com522d7572012-11-09 23:14:57 +0000199#endif
200#if defined(HAS_ARGBTOBAYERROW_NEON)
201BAYERANY(ARGBToBayerRow_Any_NEON, ARGBToBayerRow_NEON, ARGBToBayerRow_C,
fbarchard@google.comc56a55f2013-04-04 18:33:44 +0000202 7, 4, 1)
fbarchard@google.com522d7572012-11-09 23:14:57 +0000203#endif
fbarchard@google.com08b24a42013-10-25 07:39:43 +0000204#if defined(HAS_ARGBTOBAYERGGROW_SSE2)
205BAYERANY(ARGBToBayerGGRow_Any_SSE2, ARGBToBayerGGRow_SSE2, ARGBToBayerGGRow_C,
206 7, 4, 1)
207#endif
208#if defined(HAS_ARGBTOBAYERGGROW_NEON)
209BAYERANY(ARGBToBayerGGRow_Any_NEON, ARGBToBayerGGRow_NEON, ARGBToBayerGGRow_C,
210 7, 4, 1)
211#endif
212
fbarchard@google.com522d7572012-11-09 23:14:57 +0000213#undef BAYERANY
214
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000215// RGB/YUV to Y does multiple of 16 with SIMD and last 16 with SIMD.
fbarchard@google.coma3956fc2013-03-12 23:22:32 +0000216#define YANY(NAMEANY, ARGBTOY_SIMD, SBPP, BPP, NUM) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000217 void NAMEANY(const uint8* src_argb, uint8* dst_y, int width) { \
218 ARGBTOY_SIMD(src_argb, dst_y, width - NUM); \
fbarchard@google.coma3956fc2013-03-12 23:22:32 +0000219 ARGBTOY_SIMD(src_argb + (width - NUM) * SBPP, \
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000220 dst_y + (width - NUM) * BPP, NUM); \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000221 }
222
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000223#ifdef HAS_ARGBTOYROW_AVX2
fbarchard@google.coma3956fc2013-03-12 23:22:32 +0000224YANY(ARGBToYRow_Any_AVX2, ARGBToYRow_AVX2, 4, 1, 32)
fbarchard@google.com91c50c32013-04-03 23:47:10 +0000225YANY(ARGBToYJRow_Any_AVX2, ARGBToYJRow_AVX2, 4, 1, 32)
fbarchard@google.coma3956fc2013-03-12 23:22:32 +0000226YANY(YUY2ToYRow_Any_AVX2, YUY2ToYRow_AVX2, 2, 1, 32)
227YANY(UYVYToYRow_Any_AVX2, UYVYToYRow_AVX2, 2, 1, 32)
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000228#endif
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000229#ifdef HAS_ARGBTOYROW_SSSE3
fbarchard@google.coma3956fc2013-03-12 23:22:32 +0000230YANY(ARGBToYRow_Any_SSSE3, ARGBToYRow_Unaligned_SSSE3, 4, 1, 16)
fbarchard@google.com7fa21d62013-08-13 21:54:23 +0000231#endif
232#ifdef HAS_BGRATOYROW_SSSE3
fbarchard@google.coma3956fc2013-03-12 23:22:32 +0000233YANY(BGRAToYRow_Any_SSSE3, BGRAToYRow_Unaligned_SSSE3, 4, 1, 16)
234YANY(ABGRToYRow_Any_SSSE3, ABGRToYRow_Unaligned_SSSE3, 4, 1, 16)
235YANY(RGBAToYRow_Any_SSSE3, RGBAToYRow_Unaligned_SSSE3, 4, 1, 16)
236YANY(YUY2ToYRow_Any_SSE2, YUY2ToYRow_Unaligned_SSE2, 2, 1, 16)
237YANY(UYVYToYRow_Any_SSE2, UYVYToYRow_Unaligned_SSE2, 2, 1, 16)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000238#endif
fbarchard@google.comcfaa66c2013-03-26 09:14:46 +0000239#ifdef HAS_ARGBTOYJROW_SSSE3
240YANY(ARGBToYJRow_Any_SSSE3, ARGBToYJRow_Unaligned_SSSE3, 4, 1, 16)
241#endif
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000242#ifdef HAS_ARGBTOYROW_NEON
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000243YANY(ARGBToYRow_Any_NEON, ARGBToYRow_NEON, 4, 1, 8)
fbarchard@google.comcfaa66c2013-03-26 09:14:46 +0000244YANY(ARGBToYJRow_Any_NEON, ARGBToYJRow_NEON, 4, 1, 8)
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000245YANY(BGRAToYRow_Any_NEON, BGRAToYRow_NEON, 4, 1, 8)
246YANY(ABGRToYRow_Any_NEON, ABGRToYRow_NEON, 4, 1, 8)
247YANY(RGBAToYRow_Any_NEON, RGBAToYRow_NEON, 4, 1, 8)
248YANY(RGB24ToYRow_Any_NEON, RGB24ToYRow_NEON, 3, 1, 8)
249YANY(RAWToYRow_Any_NEON, RAWToYRow_NEON, 3, 1, 8)
250YANY(RGB565ToYRow_Any_NEON, RGB565ToYRow_NEON, 2, 1, 8)
fbarchard@google.com1dee6252012-11-06 02:14:23 +0000251YANY(ARGB1555ToYRow_Any_NEON, ARGB1555ToYRow_NEON, 2, 1, 8)
252YANY(ARGB4444ToYRow_Any_NEON, ARGB4444ToYRow_NEON, 2, 1, 8)
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000253YANY(YUY2ToYRow_Any_NEON, YUY2ToYRow_NEON, 2, 1, 16)
254YANY(UYVYToYRow_Any_NEON, UYVYToYRow_NEON, 2, 1, 16)
255YANY(RGB24ToARGBRow_Any_NEON, RGB24ToARGBRow_NEON, 3, 4, 8)
256YANY(RAWToARGBRow_Any_NEON, RAWToARGBRow_NEON, 3, 4, 8)
257YANY(RGB565ToARGBRow_Any_NEON, RGB565ToARGBRow_NEON, 2, 4, 8)
fbarchard@google.com4b4a32c2012-11-06 01:56:52 +0000258YANY(ARGB1555ToARGBRow_Any_NEON, ARGB1555ToARGBRow_NEON, 2, 4, 8)
259YANY(ARGB4444ToARGBRow_Any_NEON, ARGB4444ToARGBRow_NEON, 2, 4, 8)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000260#endif
261#undef YANY
262
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000263#define YANY(NAMEANY, ARGBTOY_SIMD, ARGBTOY_C, SBPP, BPP, MASK) \
264 void NAMEANY(const uint8* src_argb, uint8* dst_y, int width) { \
265 int n = width & ~MASK; \
266 ARGBTOY_SIMD(src_argb, dst_y, n); \
267 ARGBTOY_C(src_argb + n * SBPP, \
268 dst_y + n * BPP, width & MASK); \
269 }
270
fbarchard@google.com518833b2013-03-12 21:44:56 +0000271// Attenuate is destructive so last16 method can not be used due to overlap.
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000272#ifdef HAS_ARGBATTENUATEROW_SSSE3
273YANY(ARGBAttenuateRow_Any_SSSE3, ARGBAttenuateRow_SSSE3, ARGBAttenuateRow_C,
274 4, 4, 3)
275#endif
276#ifdef HAS_ARGBATTENUATEROW_SSE2
277YANY(ARGBAttenuateRow_Any_SSE2, ARGBAttenuateRow_SSE2, ARGBAttenuateRow_C,
278 4, 4, 3)
279#endif
fbarchard@google.comc0d9c342013-02-21 00:55:47 +0000280#ifdef HAS_ARGBUNATTENUATEROW_SSE2
281YANY(ARGBUnattenuateRow_Any_SSE2, ARGBUnattenuateRow_SSE2, ARGBUnattenuateRow_C,
282 4, 4, 3)
283#endif
284#ifdef HAS_ARGBATTENUATEROW_AVX2
285YANY(ARGBAttenuateRow_Any_AVX2, ARGBAttenuateRow_AVX2, ARGBAttenuateRow_C,
286 4, 4, 7)
287#endif
288#ifdef HAS_ARGBUNATTENUATEROW_AVX2
289YANY(ARGBUnattenuateRow_Any_AVX2, ARGBUnattenuateRow_AVX2, ARGBUnattenuateRow_C,
290 4, 4, 7)
291#endif
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000292#ifdef HAS_ARGBATTENUATEROW_NEON
293YANY(ARGBAttenuateRow_Any_NEON, ARGBAttenuateRow_NEON, ARGBAttenuateRow_C,
294 4, 4, 7)
295#endif
fbarchard@google.com10965432013-03-08 23:22:32 +0000296#undef YANY
fbarchard@google.com1d160cb2012-11-28 20:02:55 +0000297
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000298// RGB/YUV to UV does multiple of 16 with SIMD and remainder with C.
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000299#define UVANY(NAMEANY, ANYTOUV_SIMD, ANYTOUV_C, BPP, MASK) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000300 void NAMEANY(const uint8* src_argb, int src_stride_argb, \
301 uint8* dst_u, uint8* dst_v, int width) { \
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000302 int n = width & ~MASK; \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000303 ANYTOUV_SIMD(src_argb, src_stride_argb, dst_u, dst_v, n); \
304 ANYTOUV_C(src_argb + n * BPP, src_stride_argb, \
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000305 dst_u + (n >> 1), \
306 dst_v + (n >> 1), \
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000307 width & MASK); \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000308 }
309
fbarchard@google.com7fa21d62013-08-13 21:54:23 +0000310#ifdef HAS_ARGBTOUVROW_AVX2
fbarchard@google.comb444bae2013-02-11 20:30:41 +0000311UVANY(ARGBToUVRow_Any_AVX2, ARGBToUVRow_AVX2, ARGBToUVRow_C, 4, 31)
312UVANY(YUY2ToUVRow_Any_AVX2, YUY2ToUVRow_AVX2, YUY2ToUVRow_C, 2, 31)
313UVANY(UYVYToUVRow_Any_AVX2, UYVYToUVRow_AVX2, UYVYToUVRow_C, 2, 31)
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000314#endif
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000315#ifdef HAS_ARGBTOUVROW_SSSE3
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000316UVANY(ARGBToUVRow_Any_SSSE3, ARGBToUVRow_Unaligned_SSSE3, ARGBToUVRow_C, 4, 15)
fbarchard@google.com050b39a2013-04-01 20:07:14 +0000317UVANY(ARGBToUVJRow_Any_SSSE3, ARGBToUVJRow_Unaligned_SSSE3, ARGBToUVJRow_C,
318 4, 15)
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000319UVANY(BGRAToUVRow_Any_SSSE3, BGRAToUVRow_Unaligned_SSSE3, BGRAToUVRow_C, 4, 15)
320UVANY(ABGRToUVRow_Any_SSSE3, ABGRToUVRow_Unaligned_SSSE3, ABGRToUVRow_C, 4, 15)
321UVANY(RGBAToUVRow_Any_SSSE3, RGBAToUVRow_Unaligned_SSSE3, RGBAToUVRow_C, 4, 15)
322UVANY(YUY2ToUVRow_Any_SSE2, YUY2ToUVRow_Unaligned_SSE2, YUY2ToUVRow_C, 2, 15)
323UVANY(UYVYToUVRow_Any_SSE2, UYVYToUVRow_Unaligned_SSE2, UYVYToUVRow_C, 2, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000324#endif
fbarchard@google.comf1daa3d2012-11-07 08:27:24 +0000325#ifdef HAS_ARGBTOUVROW_NEON
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000326UVANY(ARGBToUVRow_Any_NEON, ARGBToUVRow_NEON, ARGBToUVRow_C, 4, 15)
fbarchard@google.com050b39a2013-04-01 20:07:14 +0000327UVANY(ARGBToUVJRow_Any_NEON, ARGBToUVJRow_NEON, ARGBToUVJRow_C, 4, 15)
fbarchard@google.com551d2b22013-02-08 20:57:52 +0000328UVANY(BGRAToUVRow_Any_NEON, BGRAToUVRow_NEON, BGRAToUVRow_C, 4, 15)
329UVANY(ABGRToUVRow_Any_NEON, ABGRToUVRow_NEON, ABGRToUVRow_C, 4, 15)
330UVANY(RGBAToUVRow_Any_NEON, RGBAToUVRow_NEON, RGBAToUVRow_C, 4, 15)
331UVANY(RGB24ToUVRow_Any_NEON, RGB24ToUVRow_NEON, RGB24ToUVRow_C, 3, 15)
332UVANY(RAWToUVRow_Any_NEON, RAWToUVRow_NEON, RAWToUVRow_C, 3, 15)
333UVANY(RGB565ToUVRow_Any_NEON, RGB565ToUVRow_NEON, RGB565ToUVRow_C, 2, 15)
334UVANY(ARGB1555ToUVRow_Any_NEON, ARGB1555ToUVRow_NEON, ARGB1555ToUVRow_C, 2, 15)
335UVANY(ARGB4444ToUVRow_Any_NEON, ARGB4444ToUVRow_NEON, ARGB4444ToUVRow_C, 2, 15)
336UVANY(YUY2ToUVRow_Any_NEON, YUY2ToUVRow_NEON, YUY2ToUVRow_C, 2, 15)
337UVANY(UYVYToUVRow_Any_NEON, UYVYToUVRow_NEON, UYVYToUVRow_C, 2, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000338#endif
339#undef UVANY
340
fbarchard@google.com522d7572012-11-09 23:14:57 +0000341#define UV422ANY(NAMEANY, ANYTOUV_SIMD, ANYTOUV_C, BPP, MASK, SHIFT) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000342 void NAMEANY(const uint8* src_uv, \
343 uint8* dst_u, uint8* dst_v, int width) { \
fbarchard@google.com522d7572012-11-09 23:14:57 +0000344 int n = width & ~MASK; \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000345 ANYTOUV_SIMD(src_uv, dst_u, dst_v, n); \
346 ANYTOUV_C(src_uv + n * BPP, \
fbarchard@google.com522d7572012-11-09 23:14:57 +0000347 dst_u + (n >> SHIFT), \
348 dst_v + (n >> SHIFT), \
349 width & MASK); \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000350 }
351
fbarchard@google.coma9c92422013-01-16 09:48:29 +0000352#ifdef HAS_ARGBTOUV444ROW_SSSE3
353UV422ANY(ARGBToUV444Row_Any_SSSE3, ARGBToUV444Row_Unaligned_SSSE3,
354 ARGBToUV444Row_C, 4, 15, 0)
355#endif
fbarchard@google.comb444bae2013-02-11 20:30:41 +0000356#ifdef HAS_YUY2TOUV422ROW_AVX2
357UV422ANY(YUY2ToUV422Row_Any_AVX2, YUY2ToUV422Row_AVX2,
358 YUY2ToUV422Row_C, 2, 31, 1)
359UV422ANY(UYVYToUV422Row_Any_AVX2, UYVYToUV422Row_AVX2,
360 UYVYToUV422Row_C, 2, 31, 1)
361#endif
fbarchard@google.combdf7cb52012-11-05 23:40:11 +0000362#ifdef HAS_ARGBTOUVROW_SSSE3
363UV422ANY(ARGBToUV422Row_Any_SSSE3, ARGBToUV422Row_Unaligned_SSSE3,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000364 ARGBToUV422Row_C, 4, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000365UV422ANY(YUY2ToUV422Row_Any_SSE2, YUY2ToUV422Row_Unaligned_SSE2,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000366 YUY2ToUV422Row_C, 2, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000367UV422ANY(UYVYToUV422Row_Any_SSE2, UYVYToUV422Row_Unaligned_SSE2,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000368 UYVYToUV422Row_C, 2, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000369#endif
370#ifdef HAS_YUY2TOUV422ROW_NEON
fbarchard@google.com522d7572012-11-09 23:14:57 +0000371UV422ANY(ARGBToUV444Row_Any_NEON, ARGBToUV444Row_NEON,
fbarchard@google.com752cb9e2012-11-14 05:46:56 +0000372 ARGBToUV444Row_C, 4, 7, 0)
fbarchard@google.com522d7572012-11-09 23:14:57 +0000373UV422ANY(ARGBToUV422Row_Any_NEON, ARGBToUV422Row_NEON,
374 ARGBToUV422Row_C, 4, 15, 1)
375UV422ANY(ARGBToUV411Row_Any_NEON, ARGBToUV411Row_NEON,
376 ARGBToUV411Row_C, 4, 31, 2)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000377UV422ANY(YUY2ToUV422Row_Any_NEON, YUY2ToUV422Row_NEON,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000378 YUY2ToUV422Row_C, 2, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000379UV422ANY(UYVYToUV422Row_Any_NEON, UYVYToUV422Row_NEON,
fbarchard@google.com522d7572012-11-09 23:14:57 +0000380 UYVYToUV422Row_C, 2, 15, 1)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000381#endif
382#undef UV422ANY
383
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000384#define SPLITUVROWANY(NAMEANY, ANYTOUV_SIMD, ANYTOUV_C, MASK) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000385 void NAMEANY(const uint8* src_uv, \
386 uint8* dst_u, uint8* dst_v, int width) { \
387 int n = width & ~MASK; \
388 ANYTOUV_SIMD(src_uv, dst_u, dst_v, n); \
389 ANYTOUV_C(src_uv + n * 2, \
390 dst_u + n, \
391 dst_v + n, \
392 width & MASK); \
393 }
394
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000395#ifdef HAS_SPLITUVROW_SSE2
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000396SPLITUVROWANY(SplitUVRow_Any_SSE2, SplitUVRow_Unaligned_SSE2, SplitUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000397#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000398#ifdef HAS_SPLITUVROW_AVX2
fbarchard@google.comb444bae2013-02-11 20:30:41 +0000399SPLITUVROWANY(SplitUVRow_Any_AVX2, SplitUVRow_AVX2, SplitUVRow_C, 31)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000400#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000401#ifdef HAS_SPLITUVROW_NEON
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000402SPLITUVROWANY(SplitUVRow_Any_NEON, SplitUVRow_NEON, SplitUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000403#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000404#ifdef HAS_SPLITUVROW_MIPS_DSPR2
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000405SPLITUVROWANY(SplitUVRow_Any_MIPS_DSPR2, SplitUVRow_Unaligned_MIPS_DSPR2,
fbarchard@google.comcb5262d2012-11-16 01:41:35 +0000406 SplitUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000407#endif
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000408#undef SPLITUVROWANY
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000409
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000410#define MERGEUVROW_ANY(NAMEANY, ANYTOUV_SIMD, ANYTOUV_C, MASK) \
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000411 void NAMEANY(const uint8* src_u, const uint8* src_v, \
412 uint8* dst_uv, int width) { \
413 int n = width & ~MASK; \
414 ANYTOUV_SIMD(src_u, src_v, dst_uv, n); \
415 ANYTOUV_C(src_u + n, \
416 src_v + n, \
417 dst_uv + n * 2, \
418 width & MASK); \
419 }
420
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000421#ifdef HAS_MERGEUVROW_SSE2
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000422MERGEUVROW_ANY(MergeUVRow_Any_SSE2, MergeUVRow_Unaligned_SSE2, MergeUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000423#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000424#ifdef HAS_MERGEUVROW_AVX2
fbarchard@google.comb444bae2013-02-11 20:30:41 +0000425MERGEUVROW_ANY(MergeUVRow_Any_AVX2, MergeUVRow_AVX2, MergeUVRow_C, 31)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000426#endif
fbarchard@google.comf08ac6b2012-11-15 00:21:14 +0000427#ifdef HAS_MERGEUVROW_NEON
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000428MERGEUVROW_ANY(MergeUVRow_Any_NEON, MergeUVRow_NEON, MergeUVRow_C, 15)
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000429#endif
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000430#undef MERGEUVROW_ANY
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000431
fbarchard@google.com5b0f7e12013-01-21 08:42:59 +0000432#define MATHROW_ANY(NAMEANY, ARGBMATH_SIMD, ARGBMATH_C, MASK) \
fbarchard@google.com8fa76342013-01-18 02:25:04 +0000433 void NAMEANY(const uint8* src_argb0, const uint8* src_argb1, \
434 uint8* dst_argb, int width) { \
fbarchard@google.com8ec60332013-01-17 20:18:08 +0000435 int n = width & ~MASK; \
fbarchard@google.com5b0f7e12013-01-21 08:42:59 +0000436 ARGBMATH_SIMD(src_argb0, src_argb1, dst_argb, n); \
437 ARGBMATH_C(src_argb0 + n * 4, \
fbarchard@google.com8fa76342013-01-18 02:25:04 +0000438 src_argb1 + n * 4, \
fbarchard@google.com8ec60332013-01-17 20:18:08 +0000439 dst_argb + n * 4, \
440 width & MASK); \
441 }
442
443#ifdef HAS_ARGBMULTIPLYROW_SSE2
fbarchard@google.com29aa2142013-01-18 23:43:01 +0000444MATHROW_ANY(ARGBMultiplyRow_Any_SSE2, ARGBMultiplyRow_SSE2, ARGBMultiplyRow_C,
445 3)
fbarchard@google.com8ec60332013-01-17 20:18:08 +0000446#endif
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000447#ifdef HAS_ARGBADDROW_SSE2
448MATHROW_ANY(ARGBAddRow_Any_SSE2, ARGBAddRow_SSE2, ARGBAddRow_C, 3)
449#endif
fbarchard@google.com573a8832013-01-24 23:08:12 +0000450#ifdef HAS_ARGBSUBTRACTROW_SSE2
451MATHROW_ANY(ARGBSubtractRow_Any_SSE2, ARGBSubtractRow_SSE2, ARGBSubtractRow_C,
452 3)
453#endif
fbarchard@google.com51d3e232013-03-04 21:50:23 +0000454#ifdef HAS_ARGBMULTIPLYROW_AVX2
455MATHROW_ANY(ARGBMultiplyRow_Any_AVX2, ARGBMultiplyRow_AVX2, ARGBMultiplyRow_C,
456 7)
457#endif
458#ifdef HAS_ARGBADDROW_AVX2
459MATHROW_ANY(ARGBAddRow_Any_AVX2, ARGBAddRow_AVX2, ARGBAddRow_C, 7)
460#endif
461#ifdef HAS_ARGBSUBTRACTROW_AVX2
462MATHROW_ANY(ARGBSubtractRow_Any_AVX2, ARGBSubtractRow_AVX2, ARGBSubtractRow_C,
463 7)
464#endif
fbarchard@google.com5b0f7e12013-01-21 08:42:59 +0000465#ifdef HAS_ARGBMULTIPLYROW_NEON
466MATHROW_ANY(ARGBMultiplyRow_Any_NEON, ARGBMultiplyRow_NEON, ARGBMultiplyRow_C,
467 7)
468#endif
469#ifdef HAS_ARGBADDROW_NEON
470MATHROW_ANY(ARGBAddRow_Any_NEON, ARGBAddRow_NEON, ARGBAddRow_C, 7)
471#endif
fbarchard@google.com573a8832013-01-24 23:08:12 +0000472#ifdef HAS_ARGBSUBTRACTROW_NEON
473MATHROW_ANY(ARGBSubtractRow_Any_NEON, ARGBSubtractRow_NEON, ARGBSubtractRow_C,
474 7)
475#endif
fbarchard@google.com83e1b172013-01-18 23:03:56 +0000476#undef MATHROW_ANY
477
fbarchard@google.com10965432013-03-08 23:22:32 +0000478// Shuffle may want to work in place, so last16 method can not be used.
479#define YANY(NAMEANY, ARGBTOY_SIMD, ARGBTOY_C, SBPP, BPP, MASK) \
480 void NAMEANY(const uint8* src_argb, uint8* dst_argb, \
481 const uint8* shuffler, int width) { \
482 int n = width & ~MASK; \
483 ARGBTOY_SIMD(src_argb, dst_argb, shuffler, n); \
484 ARGBTOY_C(src_argb + n * SBPP, \
485 dst_argb + n * BPP, shuffler, width & MASK); \
486 }
487
fbarchard@google.com212a1a52013-10-05 04:17:50 +0000488#ifdef HAS_ARGBSHUFFLEROW_SSE2
489YANY(ARGBShuffleRow_Any_SSE2, ARGBShuffleRow_SSE2,
490 ARGBShuffleRow_C, 4, 4, 3)
491#endif
fbarchard@google.com10965432013-03-08 23:22:32 +0000492#ifdef HAS_ARGBSHUFFLEROW_SSSE3
493YANY(ARGBShuffleRow_Any_SSSE3, ARGBShuffleRow_Unaligned_SSSE3,
494 ARGBShuffleRow_C, 4, 4, 7)
495#endif
496#ifdef HAS_ARGBSHUFFLEROW_AVX2
497YANY(ARGBShuffleRow_Any_AVX2, ARGBShuffleRow_AVX2,
498 ARGBShuffleRow_C, 4, 4, 15)
499#endif
500#ifdef HAS_ARGBSHUFFLEROW_NEON
501YANY(ARGBShuffleRow_Any_NEON, ARGBShuffleRow_NEON,
502 ARGBShuffleRow_C, 4, 4, 3)
503#endif
504#undef YANY
505
fbarchard@google.comcd6056c2013-04-15 03:05:08 +0000506// Interpolate may want to work in place, so last16 method can not be used.
fbarchard@google.comb9114282013-05-30 23:42:27 +0000507#define NANY(NAMEANY, TERP_SIMD, TERP_C, SBPP, BPP, MASK) \
508 void NAMEANY(uint8* dst_ptr, const uint8* src_ptr, \
509 ptrdiff_t src_stride_ptr, int width, \
fbarchard@google.comcd6056c2013-04-15 03:05:08 +0000510 int source_y_fraction) { \
511 int n = width & ~MASK; \
fbarchard@google.comb9114282013-05-30 23:42:27 +0000512 TERP_SIMD(dst_ptr, src_ptr, src_stride_ptr, \
513 n, source_y_fraction); \
514 TERP_C(dst_ptr + n * BPP, \
515 src_ptr + n * SBPP, src_stride_ptr, \
516 width & MASK, source_y_fraction); \
fbarchard@google.comcd6056c2013-04-15 03:05:08 +0000517 }
518
fbarchard@google.com2154de42013-09-03 07:18:21 +0000519#ifdef HAS_INTERPOLATEROW_AVX2
520NANY(InterpolateRow_Any_AVX2, InterpolateRow_AVX2,
521 InterpolateRow_C, 1, 1, 32)
522#endif
fbarchard@google.comb9114282013-05-30 23:42:27 +0000523#ifdef HAS_INTERPOLATEROW_SSSE3
524NANY(InterpolateRow_Any_SSSE3, InterpolateRow_Unaligned_SSSE3,
525 InterpolateRow_C, 1, 1, 15)
fbarchard@google.comcd6056c2013-04-15 03:05:08 +0000526#endif
fbarchard@google.comb9114282013-05-30 23:42:27 +0000527#ifdef HAS_INTERPOLATEROW_SSE2
528NANY(InterpolateRow_Any_SSE2, InterpolateRow_Unaligned_SSE2,
529 InterpolateRow_C, 1, 1, 15)
fbarchard@google.comcd6056c2013-04-15 03:05:08 +0000530#endif
fbarchard@google.comb9114282013-05-30 23:42:27 +0000531#ifdef HAS_INTERPOLATEROW_NEON
532NANY(InterpolateRow_Any_NEON, InterpolateRow_NEON,
533 InterpolateRow_C, 1, 1, 15)
534#endif
535#ifdef HAS_INTERPOLATEROW_MIPS_DSPR2
536NANY(InterpolateRow_Any_MIPS_DSPR2, InterpolateRow_MIPS_DSPR2,
537 InterpolateRow_C, 1, 1, 3)
fbarchard@google.comcd6056c2013-04-15 03:05:08 +0000538#endif
539#undef NANY
540
fbarchard@google.com4bfe1e02012-10-30 20:01:41 +0000541#ifdef __cplusplus
542} // extern "C"
543} // namespace libyuv
544#endif