row_any.cc 37.5 KB
Newer Older
1 2 3 4 5 6
/*
 *  Copyright 2012 The LibYuv Project Authors. All rights reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS. All contributing project authors may
8 9 10 11 12
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "libyuv/row.h"

13
#include <string.h>  // For memset.
14

15 16 17 18 19 20 21
#include "libyuv/basic_types.h"

#ifdef __cplusplus
namespace libyuv {
extern "C" {
#endif

22
// Subsampled source needs to be increase by 1 of not even.
23
#define SS(width, shift) (((width) + (1 << (shift)) - 1) >> (shift))
Frank Barchard's avatar
Frank Barchard committed
24

25 26 27 28
// Any 4 planes to 1 with yuvconstants
#define ANY41C(NAMEANY, ANY_SIMD, UVSHIFT, DUVSHIFT, BPP, MASK)                \
    void NAMEANY(const uint8* y_buf, const uint8* u_buf, const uint8* v_buf,   \
                 const uint8* a_buf, uint8* dst_ptr,                           \
29
                 const struct YuvConstants* yuvconstants,  int width) {        \
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
      SIMD_ALIGNED(uint8 temp[64 * 5]);                                        \
      memset(temp, 0, 64 * 4);  /* for msan */                                 \
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
        ANY_SIMD(y_buf, u_buf, v_buf, a_buf, dst_ptr, yuvconstants, n);        \
      }                                                                        \
      memcpy(temp, y_buf + n, r);                                              \
      memcpy(temp + 64, u_buf + (n >> UVSHIFT), SS(r, UVSHIFT));               \
      memcpy(temp + 128, v_buf + (n >> UVSHIFT), SS(r, UVSHIFT));              \
      memcpy(temp + 192, a_buf + n, r);                                        \
      ANY_SIMD(temp, temp + 64, temp + 128, temp + 192, temp + 256,            \
               yuvconstants, MASK + 1);                                        \
      memcpy(dst_ptr + (n >> DUVSHIFT) * BPP, temp + 256,                      \
             SS(r, DUVSHIFT) * BPP);                                           \
    }

#ifdef HAS_I422ALPHATOARGBROW_SSSE3
ANY41C(I422AlphaToARGBRow_Any_SSSE3, I422AlphaToARGBRow_SSSE3, 1, 0, 4, 7)
#endif
50
#ifdef HAS_I422ALPHATOARGBROW_AVX2
51 52 53 54
ANY41C(I422AlphaToARGBRow_Any_AVX2, I422AlphaToARGBRow_AVX2, 1, 0, 4, 15)
#endif
#ifdef HAS_I422ALPHATOARGBROW_NEON
ANY41C(I422AlphaToARGBRow_Any_NEON, I422AlphaToARGBRow_NEON, 1, 0, 4, 7)
55
#endif
56 57
#undef ANY41C

58 59
// Any 3 planes to 1.
#define ANY31(NAMEANY, ANY_SIMD, UVSHIFT, DUVSHIFT, BPP, MASK)                 \
60
    void NAMEANY(const uint8* y_buf, const uint8* u_buf, const uint8* v_buf,   \
61
                 uint8* dst_ptr, int width) {                                  \
62
      SIMD_ALIGNED(uint8 temp[64 * 4]);                                        \
Frank Barchard's avatar
Frank Barchard committed
63
      memset(temp, 0, 64 * 3);  /* for YUY2 and msan */                        \
64
      int r = width & MASK;                                                    \
65
      int n = width & ~MASK;                                                   \
66
      if (n > 0) {                                                             \
67
        ANY_SIMD(y_buf, u_buf, v_buf, dst_ptr, n);                             \
68
      }                                                                        \
Frank Barchard's avatar
Frank Barchard committed
69 70 71
      memcpy(temp, y_buf + n, r);                                              \
      memcpy(temp + 64, u_buf + (n >> UVSHIFT), SS(r, UVSHIFT));               \
      memcpy(temp + 128, v_buf + (n >> UVSHIFT), SS(r, UVSHIFT));              \
72
      ANY_SIMD(temp, temp + 64, temp + 128, temp + 192, MASK + 1);             \
73
      memcpy(dst_ptr + (n >> DUVSHIFT) * BPP, temp + 192,                      \
Frank Barchard's avatar
Frank Barchard committed
74
             SS(r, DUVSHIFT) * BPP);                                           \
75
    }
76 77 78 79 80 81 82 83 84 85
#ifdef HAS_I422TOYUY2ROW_SSE2
ANY31(I422ToYUY2Row_Any_SSE2, I422ToYUY2Row_SSE2, 1, 1, 4, 15)
ANY31(I422ToUYVYRow_Any_SSE2, I422ToUYVYRow_SSE2, 1, 1, 4, 15)
#endif
#ifdef HAS_I422TOYUY2ROW_NEON
ANY31(I422ToYUY2Row_Any_NEON, I422ToYUY2Row_NEON, 1, 1, 4, 15)
#endif
#ifdef HAS_I422TOUYVYROW_NEON
ANY31(I422ToUYVYRow_Any_NEON, I422ToUYVYRow_NEON, 1, 1, 4, 15)
#endif
Frank Barchard's avatar
Frank Barchard committed
86 87 88 89 90 91
#ifdef HAS_BLENDPLANEROW_AVX2
ANY31(BlendPlaneRow_Any_AVX2, BlendPlaneRow_AVX2, 0, 0, 1, 31)
#endif
#ifdef HAS_BLENDPLANEROW_SSSE3
ANY31(BlendPlaneRow_Any_SSSE3, BlendPlaneRow_SSSE3, 0, 0, 1, 7)
#endif
92
#undef ANY31
93

Frank Barchard's avatar
Frank Barchard committed
94 95
// Note that odd width replication includes 444 due to implementation
// on arm that subsamples 444 to 422 internally.
96 97 98
// Any 3 planes to 1 with yuvconstants
#define ANY31C(NAMEANY, ANY_SIMD, UVSHIFT, DUVSHIFT, BPP, MASK)                \
    void NAMEANY(const uint8* y_buf, const uint8* u_buf, const uint8* v_buf,   \
99
                 uint8* dst_ptr, const struct YuvConstants* yuvconstants,      \
100 101 102 103 104 105 106 107 108 109 110
                 int width) {                                                  \
      SIMD_ALIGNED(uint8 temp[64 * 4]);                                        \
      memset(temp, 0, 64 * 3);  /* for YUY2 and msan */                        \
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
        ANY_SIMD(y_buf, u_buf, v_buf, dst_ptr, yuvconstants, n);               \
      }                                                                        \
      memcpy(temp, y_buf + n, r);                                              \
      memcpy(temp + 64, u_buf + (n >> UVSHIFT), SS(r, UVSHIFT));               \
      memcpy(temp + 128, v_buf + (n >> UVSHIFT), SS(r, UVSHIFT));              \
Frank Barchard's avatar
Frank Barchard committed
111 112 113 114
      if (width & 1) {                                                         \
        temp[64 + SS(r, UVSHIFT)] = temp[64 + SS(r, UVSHIFT) - 1];             \
        temp[128 + SS(r, UVSHIFT)] = temp[128 + SS(r, UVSHIFT) - 1];           \
      }                                                                        \
115 116 117 118 119
      ANY_SIMD(temp, temp + 64, temp + 128, temp + 192,                        \
               yuvconstants, MASK + 1);                                        \
      memcpy(dst_ptr + (n >> DUVSHIFT) * BPP, temp + 192,                      \
             SS(r, DUVSHIFT) * BPP);                                           \
    }
120 121

#ifdef HAS_I422TOARGBROW_SSSE3
122
ANY31C(I422ToARGBRow_Any_SSSE3, I422ToARGBRow_SSSE3, 1, 0, 4, 7)
123
#endif
124 125 126
#ifdef HAS_I411TOARGBROW_SSSE3
ANY31C(I411ToARGBRow_Any_SSSE3, I411ToARGBRow_SSSE3, 2, 0, 4, 7)
#endif
127
#ifdef HAS_I444TOARGBROW_SSSE3
128 129 130 131 132 133
ANY31C(I444ToARGBRow_Any_SSSE3, I444ToARGBRow_SSSE3, 0, 0, 4, 7)
ANY31C(I422ToRGBARow_Any_SSSE3, I422ToRGBARow_SSSE3, 1, 0, 4, 7)
ANY31C(I422ToARGB4444Row_Any_SSSE3, I422ToARGB4444Row_SSSE3, 1, 0, 2, 7)
ANY31C(I422ToARGB1555Row_Any_SSSE3, I422ToARGB1555Row_SSSE3, 1, 0, 2, 7)
ANY31C(I422ToRGB565Row_Any_SSSE3, I422ToRGB565Row_SSSE3, 1, 0, 2, 7)
ANY31C(I422ToRGB24Row_Any_SSSE3, I422ToRGB24Row_SSSE3, 1, 0, 3, 7)
134
#endif  // HAS_I444TOARGBROW_SSSE3
135
#ifdef HAS_I422TORGB24ROW_AVX2
136
ANY31C(I422ToRGB24Row_Any_AVX2, I422ToRGB24Row_AVX2, 1, 0, 3, 15)
137
#endif
138
#ifdef HAS_I422TOARGBROW_AVX2
139
ANY31C(I422ToARGBRow_Any_AVX2, I422ToARGBRow_AVX2, 1, 0, 4, 15)
140
#endif
141
#ifdef HAS_I422TORGBAROW_AVX2
142
ANY31C(I422ToRGBARow_Any_AVX2, I422ToRGBARow_AVX2, 1, 0, 4, 15)
143
#endif
144
#ifdef HAS_I444TOARGBROW_AVX2
145
ANY31C(I444ToARGBRow_Any_AVX2, I444ToARGBRow_AVX2, 0, 0, 4, 15)
146
#endif
147
#ifdef HAS_I411TOARGBROW_AVX2
148
ANY31C(I411ToARGBRow_Any_AVX2, I411ToARGBRow_AVX2, 2, 0, 4, 15)
149
#endif
150
#ifdef HAS_I422TOARGB4444ROW_AVX2
151
ANY31C(I422ToARGB4444Row_Any_AVX2, I422ToARGB4444Row_AVX2, 1, 0, 2, 7)
152 153
#endif
#ifdef HAS_I422TOARGB1555ROW_AVX2
154
ANY31C(I422ToARGB1555Row_Any_AVX2, I422ToARGB1555Row_AVX2, 1, 0, 2, 7)
155 156
#endif
#ifdef HAS_I422TORGB565ROW_AVX2
157
ANY31C(I422ToRGB565Row_Any_AVX2, I422ToRGB565Row_AVX2, 1, 0, 2, 7)
158
#endif
159
#ifdef HAS_I422TOARGBROW_NEON
160 161 162 163 164 165 166 167 168 169
ANY31C(I444ToARGBRow_Any_NEON, I444ToARGBRow_NEON, 0, 0, 4, 7)
ANY31C(I422ToARGBRow_Any_NEON, I422ToARGBRow_NEON, 1, 0, 4, 7)
ANY31C(I411ToARGBRow_Any_NEON, I411ToARGBRow_NEON, 2, 0, 4, 7)
ANY31C(I422ToRGBARow_Any_NEON, I422ToRGBARow_NEON, 1, 0, 4, 7)
ANY31C(I422ToRGB24Row_Any_NEON, I422ToRGB24Row_NEON, 1, 0, 3, 7)
ANY31C(I422ToARGB4444Row_Any_NEON, I422ToARGB4444Row_NEON, 1, 0, 2, 7)
ANY31C(I422ToARGB1555Row_Any_NEON, I422ToARGB1555Row_NEON, 1, 0, 2, 7)
ANY31C(I422ToRGB565Row_Any_NEON, I422ToRGB565Row_NEON, 1, 0, 2, 7)
#endif
#undef ANY31C
170

171
// Any 2 planes to 1.
172
#define ANY21(NAMEANY, ANY_SIMD, UVSHIFT, SBPP, SBPP2, BPP, MASK)              \
173
    void NAMEANY(const uint8* y_buf, const uint8* uv_buf,                      \
174
                 uint8* dst_ptr, int width) {                                  \
175
      SIMD_ALIGNED(uint8 temp[64 * 3]);                                        \
Frank Barchard's avatar
Frank Barchard committed
176
      memset(temp, 0, 64 * 2);  /* for msan */                                 \
177
      int r = width & MASK;                                                    \
178
      int n = width & ~MASK;                                                   \
179
      if (n > 0) {                                                             \
180
        ANY_SIMD(y_buf, uv_buf, dst_ptr, n);                                   \
181
      }                                                                        \
182 183 184
      memcpy(temp, y_buf + n * SBPP, r * SBPP);                                \
      memcpy(temp + 64, uv_buf + (n >> UVSHIFT) * SBPP2,                       \
             SS(r, UVSHIFT) * SBPP2);                                          \
185
      ANY_SIMD(temp, temp + 64, temp + 128, MASK + 1);                         \
186
      memcpy(dst_ptr + n * BPP, temp + 128, r * BPP);                          \
187 188
    }

Frank Barchard's avatar
Frank Barchard committed
189 190 191 192 193 194 195 196 197 198 199
// Merge functions.
#ifdef HAS_MERGEUVROW_SSE2
ANY21(MergeUVRow_Any_SSE2, MergeUVRow_SSE2, 0, 1, 1, 2, 15)
#endif
#ifdef HAS_MERGEUVROW_AVX2
ANY21(MergeUVRow_Any_AVX2, MergeUVRow_AVX2, 0, 1, 1, 2, 31)
#endif
#ifdef HAS_MERGEUVROW_NEON
ANY21(MergeUVRow_Any_NEON, MergeUVRow_NEON, 0, 1, 1, 2, 15)
#endif

Frank Barchard's avatar
Frank Barchard committed
200 201
// Math functions.
#ifdef HAS_ARGBMULTIPLYROW_SSE2
202
ANY21(ARGBMultiplyRow_Any_SSE2, ARGBMultiplyRow_SSE2, 0, 4, 4, 4, 3)
Frank Barchard's avatar
Frank Barchard committed
203 204
#endif
#ifdef HAS_ARGBADDROW_SSE2
205
ANY21(ARGBAddRow_Any_SSE2, ARGBAddRow_SSE2, 0, 4, 4, 4, 3)
Frank Barchard's avatar
Frank Barchard committed
206 207
#endif
#ifdef HAS_ARGBSUBTRACTROW_SSE2
208
ANY21(ARGBSubtractRow_Any_SSE2, ARGBSubtractRow_SSE2, 0, 4, 4, 4, 3)
Frank Barchard's avatar
Frank Barchard committed
209 210
#endif
#ifdef HAS_ARGBMULTIPLYROW_AVX2
211
ANY21(ARGBMultiplyRow_Any_AVX2, ARGBMultiplyRow_AVX2, 0, 4, 4, 4, 7)
Frank Barchard's avatar
Frank Barchard committed
212 213
#endif
#ifdef HAS_ARGBADDROW_AVX2
214
ANY21(ARGBAddRow_Any_AVX2, ARGBAddRow_AVX2, 0, 4, 4, 4, 7)
Frank Barchard's avatar
Frank Barchard committed
215 216
#endif
#ifdef HAS_ARGBSUBTRACTROW_AVX2
217
ANY21(ARGBSubtractRow_Any_AVX2, ARGBSubtractRow_AVX2, 0, 4, 4, 4, 7)
Frank Barchard's avatar
Frank Barchard committed
218 219
#endif
#ifdef HAS_ARGBMULTIPLYROW_NEON
220
ANY21(ARGBMultiplyRow_Any_NEON, ARGBMultiplyRow_NEON, 0, 4, 4, 4, 7)
Frank Barchard's avatar
Frank Barchard committed
221 222
#endif
#ifdef HAS_ARGBADDROW_NEON
223
ANY21(ARGBAddRow_Any_NEON, ARGBAddRow_NEON, 0, 4, 4, 4, 7)
Frank Barchard's avatar
Frank Barchard committed
224 225
#endif
#ifdef HAS_ARGBSUBTRACTROW_NEON
226
ANY21(ARGBSubtractRow_Any_NEON, ARGBSubtractRow_NEON, 0, 4, 4, 4, 7)
Frank Barchard's avatar
Frank Barchard committed
227 228
#endif
#ifdef HAS_SOBELROW_SSE2
229
ANY21(SobelRow_Any_SSE2, SobelRow_SSE2, 0, 1, 1, 4, 15)
Frank Barchard's avatar
Frank Barchard committed
230 231
#endif
#ifdef HAS_SOBELROW_NEON
232
ANY21(SobelRow_Any_NEON, SobelRow_NEON, 0, 1, 1, 4, 7)
Frank Barchard's avatar
Frank Barchard committed
233 234
#endif
#ifdef HAS_SOBELTOPLANEROW_SSE2
235
ANY21(SobelToPlaneRow_Any_SSE2, SobelToPlaneRow_SSE2, 0, 1, 1, 1, 15)
Frank Barchard's avatar
Frank Barchard committed
236 237
#endif
#ifdef HAS_SOBELTOPLANEROW_NEON
238
ANY21(SobelToPlaneRow_Any_NEON, SobelToPlaneRow_NEON, 0, 1, 1, 1, 15)
Frank Barchard's avatar
Frank Barchard committed
239 240
#endif
#ifdef HAS_SOBELXYROW_SSE2
241
ANY21(SobelXYRow_Any_SSE2, SobelXYRow_SSE2, 0, 1, 1, 4, 15)
Frank Barchard's avatar
Frank Barchard committed
242 243
#endif
#ifdef HAS_SOBELXYROW_NEON
244
ANY21(SobelXYRow_Any_NEON, SobelXYRow_NEON, 0, 1, 1, 4, 7)
Frank Barchard's avatar
Frank Barchard committed
245
#endif
246
#undef ANY21
247

248 249 250
// Any 2 planes to 1 with yuvconstants
#define ANY21C(NAMEANY, ANY_SIMD, UVSHIFT, SBPP, SBPP2, BPP, MASK)             \
    void NAMEANY(const uint8* y_buf, const uint8* uv_buf,                      \
251
                 uint8* dst_ptr, const struct YuvConstants* yuvconstants,      \
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276
                 int width) {                                                  \
      SIMD_ALIGNED(uint8 temp[64 * 3]);                                        \
      memset(temp, 0, 64 * 2);  /* for msan */                                 \
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
        ANY_SIMD(y_buf, uv_buf, dst_ptr, yuvconstants, n);                     \
      }                                                                        \
      memcpy(temp, y_buf + n * SBPP, r * SBPP);                                \
      memcpy(temp + 64, uv_buf + (n >> UVSHIFT) * SBPP2,                       \
             SS(r, UVSHIFT) * SBPP2);                                          \
      ANY_SIMD(temp, temp + 64, temp + 128, yuvconstants, MASK + 1);           \
      memcpy(dst_ptr + n * BPP, temp + 128, r * BPP);                          \
    }

// Biplanar to RGB.
#ifdef HAS_NV12TOARGBROW_SSSE3
ANY21C(NV12ToARGBRow_Any_SSSE3, NV12ToARGBRow_SSSE3, 1, 1, 2, 4, 7)
#endif
#ifdef HAS_NV12TOARGBROW_AVX2
ANY21C(NV12ToARGBRow_Any_AVX2, NV12ToARGBRow_AVX2, 1, 1, 2, 4, 15)
#endif
#ifdef HAS_NV12TOARGBROW_NEON
ANY21C(NV12ToARGBRow_Any_NEON, NV12ToARGBRow_NEON, 1, 1, 2, 4, 7)
#endif
277 278 279 280 281 282 283
#ifdef HAS_NV21TOARGBROW_SSSE3
ANY21C(NV21ToARGBRow_Any_SSSE3, NV21ToARGBRow_SSSE3, 1, 1, 2, 4, 7)
#endif
#ifdef HAS_NV21TOARGBROW_AVX2
ANY21C(NV21ToARGBRow_Any_AVX2, NV21ToARGBRow_AVX2, 1, 1, 2, 4, 15)
#endif
#ifdef HAS_NV21TOARGBROW_NEON
Frank Barchard's avatar
Frank Barchard committed
284
ANY21C(NV21ToARGBRow_Any_NEON, NV21ToARGBRow_NEON, 1, 1, 2, 4, 7)
285
#endif
286 287 288 289 290 291 292 293 294 295 296
#ifdef HAS_NV12TORGB565ROW_SSSE3
ANY21C(NV12ToRGB565Row_Any_SSSE3, NV12ToRGB565Row_SSSE3, 1, 1, 2, 2, 7)
#endif
#ifdef HAS_NV12TORGB565ROW_AVX2
ANY21C(NV12ToRGB565Row_Any_AVX2, NV12ToRGB565Row_AVX2, 1, 1, 2, 2, 15)
#endif
#ifdef HAS_NV12TORGB565ROW_NEON
ANY21C(NV12ToRGB565Row_Any_NEON, NV12ToRGB565Row_NEON, 1, 1, 2, 2, 7)
#endif
#undef ANY21C

297
// Any 1 to 1.
298 299
#define ANY11(NAMEANY, ANY_SIMD, UVSHIFT, SBPP, BPP, MASK)                     \
    void NAMEANY(const uint8* src_ptr, uint8* dst_ptr, int width) {            \
300 301
      SIMD_ALIGNED(uint8 temp[128 * 2]);                                       \
      memset(temp, 0, 128);  /* for YUY2 and msan */                           \
302
      int r = width & MASK;                                                    \
303
      int n = width & ~MASK;                                                   \
304
      if (n > 0) {                                                             \
305
        ANY_SIMD(src_ptr, dst_ptr, n);                                         \
306
      }                                                                        \
307
      memcpy(temp, src_ptr + (n >> UVSHIFT) * SBPP, SS(r, UVSHIFT) * SBPP);    \
308 309
      ANY_SIMD(temp, temp + 128, MASK + 1);                                    \
      memcpy(dst_ptr + n * BPP, temp + 128, r * BPP);                          \
310 311
    }

312
#ifdef HAS_COPYROW_AVX
Frank Barchard's avatar
Frank Barchard committed
313
ANY11(CopyRow_Any_AVX, CopyRow_AVX, 0, 1, 1, 63)
314 315
#endif
#ifdef HAS_COPYROW_SSE2
Frank Barchard's avatar
Frank Barchard committed
316
ANY11(CopyRow_Any_SSE2, CopyRow_SSE2, 0, 1, 1, 31)
317 318
#endif
#ifdef HAS_COPYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
319
ANY11(CopyRow_Any_NEON, CopyRow_NEON, 0, 1, 1, 31)
320
#endif
321
#if defined(HAS_ARGBTORGB24ROW_SSSE3)
Frank Barchard's avatar
Frank Barchard committed
322 323 324 325 326
ANY11(ARGBToRGB24Row_Any_SSSE3, ARGBToRGB24Row_SSSE3, 0, 4, 3, 15)
ANY11(ARGBToRAWRow_Any_SSSE3, ARGBToRAWRow_SSSE3, 0, 4, 3, 15)
ANY11(ARGBToRGB565Row_Any_SSE2, ARGBToRGB565Row_SSE2, 0, 4, 2, 3)
ANY11(ARGBToARGB1555Row_Any_SSE2, ARGBToARGB1555Row_SSE2, 0, 4, 2, 3)
ANY11(ARGBToARGB4444Row_Any_SSE2, ARGBToARGB4444Row_SSE2, 0, 4, 2, 3)
327
#endif
328
#if defined(HAS_ARGBTORGB565ROW_AVX2)
Frank Barchard's avatar
Frank Barchard committed
329
ANY11(ARGBToRGB565Row_Any_AVX2, ARGBToRGB565Row_AVX2, 0, 4, 2, 7)
330 331
#endif
#if defined(HAS_ARGBTOARGB4444ROW_AVX2)
Frank Barchard's avatar
Frank Barchard committed
332 333
ANY11(ARGBToARGB1555Row_Any_AVX2, ARGBToARGB1555Row_AVX2, 0, 4, 2, 7)
ANY11(ARGBToARGB4444Row_Any_AVX2, ARGBToARGB4444Row_AVX2, 0, 4, 2, 7)
334
#endif
335
#if defined(HAS_J400TOARGBROW_SSE2)
Frank Barchard's avatar
Frank Barchard committed
336
ANY11(J400ToARGBRow_Any_SSE2, J400ToARGBRow_SSE2, 0, 1, 4, 7)
337 338
#endif
#if defined(HAS_J400TOARGBROW_AVX2)
Frank Barchard's avatar
Frank Barchard committed
339
ANY11(J400ToARGBRow_Any_AVX2, J400ToARGBRow_AVX2, 0, 1, 4, 15)
340
#endif
341
#if defined(HAS_I400TOARGBROW_SSE2)
Frank Barchard's avatar
Frank Barchard committed
342
ANY11(I400ToARGBRow_Any_SSE2, I400ToARGBRow_SSE2, 0, 1, 4, 7)
343
#endif
344
#if defined(HAS_I400TOARGBROW_AVX2)
Frank Barchard's avatar
Frank Barchard committed
345
ANY11(I400ToARGBRow_Any_AVX2, I400ToARGBRow_AVX2, 0, 1, 4, 15)
346
#endif
347
#if defined(HAS_RGB24TOARGBROW_SSSE3)
Frank Barchard's avatar
Frank Barchard committed
348 349 350 351 352
ANY11(RGB24ToARGBRow_Any_SSSE3, RGB24ToARGBRow_SSSE3, 0, 3, 4, 15)
ANY11(RAWToARGBRow_Any_SSSE3, RAWToARGBRow_SSSE3, 0, 3, 4, 15)
ANY11(RGB565ToARGBRow_Any_SSE2, RGB565ToARGBRow_SSE2, 0, 2, 4, 7)
ANY11(ARGB1555ToARGBRow_Any_SSE2, ARGB1555ToARGBRow_SSE2, 0, 2, 4, 7)
ANY11(ARGB4444ToARGBRow_Any_SSE2, ARGB4444ToARGBRow_SSE2, 0, 2, 4, 7)
353
#endif
354 355 356
#if defined(HAS_RAWTORGB24ROW_SSSE3)
ANY11(RAWToRGB24Row_Any_SSSE3, RAWToRGB24Row_SSSE3, 0, 3, 3, 7)
#endif
357
#if defined(HAS_RGB565TOARGBROW_AVX2)
Frank Barchard's avatar
Frank Barchard committed
358
ANY11(RGB565ToARGBRow_Any_AVX2, RGB565ToARGBRow_AVX2, 0, 2, 4, 15)
359
#endif
360
#if defined(HAS_ARGB1555TOARGBROW_AVX2)
Frank Barchard's avatar
Frank Barchard committed
361
ANY11(ARGB1555ToARGBRow_Any_AVX2, ARGB1555ToARGBRow_AVX2, 0, 2, 4, 15)
362 363
#endif
#if defined(HAS_ARGB4444TOARGBROW_AVX2)
Frank Barchard's avatar
Frank Barchard committed
364
ANY11(ARGB4444ToARGBRow_Any_AVX2, ARGB4444ToARGBRow_AVX2, 0, 2, 4, 15)
365
#endif
366
#if defined(HAS_ARGBTORGB24ROW_NEON)
Frank Barchard's avatar
Frank Barchard committed
367 368 369 370 371 372 373
ANY11(ARGBToRGB24Row_Any_NEON, ARGBToRGB24Row_NEON, 0, 4, 3, 7)
ANY11(ARGBToRAWRow_Any_NEON, ARGBToRAWRow_NEON, 0, 4, 3, 7)
ANY11(ARGBToRGB565Row_Any_NEON, ARGBToRGB565Row_NEON, 0, 4, 2, 7)
ANY11(ARGBToARGB1555Row_Any_NEON, ARGBToARGB1555Row_NEON, 0, 4, 2, 7)
ANY11(ARGBToARGB4444Row_Any_NEON, ARGBToARGB4444Row_NEON, 0, 4, 2, 7)
ANY11(J400ToARGBRow_Any_NEON, J400ToARGBRow_NEON, 0, 1, 4, 7)
ANY11(I400ToARGBRow_Any_NEON, I400ToARGBRow_NEON, 0, 1, 4, 7)
374
#endif
375 376 377
#if defined(HAS_RAWTORGB24ROW_NEON)
ANY11(RAWToRGB24Row_Any_NEON, RAWToRGB24Row_NEON, 0, 3, 3, 7)
#endif
378
#ifdef HAS_ARGBTOYROW_AVX2
Frank Barchard's avatar
Frank Barchard committed
379
ANY11(ARGBToYRow_Any_AVX2, ARGBToYRow_AVX2, 0, 4, 1, 31)
380 381
#endif
#ifdef HAS_ARGBTOYJROW_AVX2
Frank Barchard's avatar
Frank Barchard committed
382
ANY11(ARGBToYJRow_Any_AVX2, ARGBToYJRow_AVX2, 0, 4, 1, 31)
383 384
#endif
#ifdef HAS_UYVYTOYROW_AVX2
Frank Barchard's avatar
Frank Barchard committed
385
ANY11(UYVYToYRow_Any_AVX2, UYVYToYRow_AVX2, 0, 2, 1, 31)
386
#endif
387
#ifdef HAS_YUY2TOYROW_AVX2
Frank Barchard's avatar
Frank Barchard committed
388
ANY11(YUY2ToYRow_Any_AVX2, YUY2ToYRow_AVX2, 1, 4, 1, 31)
389
#endif
390
#ifdef HAS_ARGBTOYROW_SSSE3
Frank Barchard's avatar
Frank Barchard committed
391
ANY11(ARGBToYRow_Any_SSSE3, ARGBToYRow_SSSE3, 0, 4, 1, 15)
392 393
#endif
#ifdef HAS_BGRATOYROW_SSSE3
Frank Barchard's avatar
Frank Barchard committed
394 395 396 397 398
ANY11(BGRAToYRow_Any_SSSE3, BGRAToYRow_SSSE3, 0, 4, 1, 15)
ANY11(ABGRToYRow_Any_SSSE3, ABGRToYRow_SSSE3, 0, 4, 1, 15)
ANY11(RGBAToYRow_Any_SSSE3, RGBAToYRow_SSSE3, 0, 4, 1, 15)
ANY11(YUY2ToYRow_Any_SSE2, YUY2ToYRow_SSE2, 1, 4, 1, 15)
ANY11(UYVYToYRow_Any_SSE2, UYVYToYRow_SSE2, 1, 4, 1, 15)
399
#endif
400
#ifdef HAS_ARGBTOYJROW_SSSE3
Frank Barchard's avatar
Frank Barchard committed
401
ANY11(ARGBToYJRow_Any_SSSE3, ARGBToYJRow_SSSE3, 0, 4, 1, 15)
402
#endif
403
#ifdef HAS_ARGBTOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
404
ANY11(ARGBToYRow_Any_NEON, ARGBToYRow_NEON, 0, 4, 1, 7)
405 406
#endif
#ifdef HAS_ARGBTOYJROW_NEON
Frank Barchard's avatar
Frank Barchard committed
407
ANY11(ARGBToYJRow_Any_NEON, ARGBToYJRow_NEON, 0, 4, 1, 7)
408 409
#endif
#ifdef HAS_BGRATOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
410
ANY11(BGRAToYRow_Any_NEON, BGRAToYRow_NEON, 0, 4, 1, 7)
411 412
#endif
#ifdef HAS_ABGRTOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
413
ANY11(ABGRToYRow_Any_NEON, ABGRToYRow_NEON, 0, 4, 1, 7)
414 415
#endif
#ifdef HAS_RGBATOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
416
ANY11(RGBAToYRow_Any_NEON, RGBAToYRow_NEON, 0, 4, 1, 7)
417 418
#endif
#ifdef HAS_RGB24TOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
419
ANY11(RGB24ToYRow_Any_NEON, RGB24ToYRow_NEON, 0, 3, 1, 7)
420 421
#endif
#ifdef HAS_RAWTOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
422
ANY11(RAWToYRow_Any_NEON, RAWToYRow_NEON, 0, 3, 1, 7)
423 424
#endif
#ifdef HAS_RGB565TOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
425
ANY11(RGB565ToYRow_Any_NEON, RGB565ToYRow_NEON, 0, 2, 1, 7)
426 427
#endif
#ifdef HAS_ARGB1555TOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
428
ANY11(ARGB1555ToYRow_Any_NEON, ARGB1555ToYRow_NEON, 0, 2, 1, 7)
429 430
#endif
#ifdef HAS_ARGB4444TOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
431
ANY11(ARGB4444ToYRow_Any_NEON, ARGB4444ToYRow_NEON, 0, 2, 1, 7)
432 433
#endif
#ifdef HAS_YUY2TOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
434
ANY11(YUY2ToYRow_Any_NEON, YUY2ToYRow_NEON, 1, 4, 1, 15)
435 436
#endif
#ifdef HAS_UYVYTOYROW_NEON
Frank Barchard's avatar
Frank Barchard committed
437
ANY11(UYVYToYRow_Any_NEON, UYVYToYRow_NEON, 0, 2, 1, 15)
438 439
#endif
#ifdef HAS_RGB24TOARGBROW_NEON
Frank Barchard's avatar
Frank Barchard committed
440
ANY11(RGB24ToARGBRow_Any_NEON, RGB24ToARGBRow_NEON, 0, 3, 4, 7)
441 442
#endif
#ifdef HAS_RAWTOARGBROW_NEON
Frank Barchard's avatar
Frank Barchard committed
443
ANY11(RAWToARGBRow_Any_NEON, RAWToARGBRow_NEON, 0, 3, 4, 7)
444 445
#endif
#ifdef HAS_RGB565TOARGBROW_NEON
Frank Barchard's avatar
Frank Barchard committed
446
ANY11(RGB565ToARGBRow_Any_NEON, RGB565ToARGBRow_NEON, 0, 2, 4, 7)
447 448
#endif
#ifdef HAS_ARGB1555TOARGBROW_NEON
Frank Barchard's avatar
Frank Barchard committed
449
ANY11(ARGB1555ToARGBRow_Any_NEON, ARGB1555ToARGBRow_NEON, 0, 2, 4, 7)
450 451
#endif
#ifdef HAS_ARGB4444TOARGBROW_NEON
Frank Barchard's avatar
Frank Barchard committed
452
ANY11(ARGB4444ToARGBRow_Any_NEON, ARGB4444ToARGBRow_NEON, 0, 2, 4, 7)
453
#endif
454
#ifdef HAS_ARGBATTENUATEROW_SSSE3
Frank Barchard's avatar
Frank Barchard committed
455
ANY11(ARGBAttenuateRow_Any_SSSE3, ARGBAttenuateRow_SSSE3, 0, 4, 4, 3)
456
#endif
457
#ifdef HAS_ARGBUNATTENUATEROW_SSE2
Frank Barchard's avatar
Frank Barchard committed
458
ANY11(ARGBUnattenuateRow_Any_SSE2, ARGBUnattenuateRow_SSE2, 0, 4, 4, 3)
459 460
#endif
#ifdef HAS_ARGBATTENUATEROW_AVX2
Frank Barchard's avatar
Frank Barchard committed
461
ANY11(ARGBAttenuateRow_Any_AVX2, ARGBAttenuateRow_AVX2, 0, 4, 4, 7)
462 463
#endif
#ifdef HAS_ARGBUNATTENUATEROW_AVX2
Frank Barchard's avatar
Frank Barchard committed
464
ANY11(ARGBUnattenuateRow_Any_AVX2, ARGBUnattenuateRow_AVX2, 0, 4, 4, 7)
465
#endif
466
#ifdef HAS_ARGBATTENUATEROW_NEON
Frank Barchard's avatar
Frank Barchard committed
467
ANY11(ARGBAttenuateRow_Any_NEON, ARGBAttenuateRow_NEON, 0, 4, 4, 7)
468 469 470
#endif
#undef ANY11

471 472 473
// Any 1 to 1 with yuvconstants
#define ANY11C(NAMEANY, ANY_SIMD, UVSHIFT, SBPP, BPP, MASK)                    \
    void NAMEANY(const uint8* src_ptr, uint8* dst_ptr,                         \
474
                 const struct YuvConstants* yuvconstants, int width) {         \
475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499
      SIMD_ALIGNED(uint8 temp[128 * 2]);                                       \
      memset(temp, 0, 128);  /* for YUY2 and msan */                           \
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
        ANY_SIMD(src_ptr, dst_ptr, yuvconstants, n);                           \
      }                                                                        \
      memcpy(temp, src_ptr + (n >> UVSHIFT) * SBPP, SS(r, UVSHIFT) * SBPP);    \
      ANY_SIMD(temp, temp + 128, yuvconstants, MASK + 1);                      \
      memcpy(dst_ptr + n * BPP, temp + 128, r * BPP);                          \
    }
#if defined(HAS_YUY2TOARGBROW_SSSE3)
ANY11C(YUY2ToARGBRow_Any_SSSE3, YUY2ToARGBRow_SSSE3, 1, 4, 4, 15)
ANY11C(UYVYToARGBRow_Any_SSSE3, UYVYToARGBRow_SSSE3, 1, 4, 4, 15)
#endif
#if defined(HAS_YUY2TOARGBROW_AVX2)
ANY11C(YUY2ToARGBRow_Any_AVX2, YUY2ToARGBRow_AVX2, 1, 4, 4, 31)
ANY11C(UYVYToARGBRow_Any_AVX2, UYVYToARGBRow_AVX2, 1, 4, 4, 31)
#endif
#if defined(HAS_YUY2TOARGBROW_NEON)
ANY11C(YUY2ToARGBRow_Any_NEON, YUY2ToARGBRow_NEON, 1, 4, 4, 7)
ANY11C(UYVYToARGBRow_Any_NEON, UYVYToARGBRow_NEON, 1, 4, 4, 7)
#endif
#undef ANY11C

500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
// Any 1 to 1 blended.
#define ANY11B(NAMEANY, ANY_SIMD, UVSHIFT, SBPP, BPP, MASK)                    \
    void NAMEANY(const uint8* src_ptr, uint8* dst_ptr, int width) {            \
      SIMD_ALIGNED(uint8 temp[128 * 2]);                                       \
      memset(temp, 0, 128 * 2);  /* for YUY2 and msan */                       \
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
        ANY_SIMD(src_ptr, dst_ptr, n);                                         \
      }                                                                        \
      memcpy(temp, src_ptr + (n >> UVSHIFT) * SBPP, SS(r, UVSHIFT) * SBPP);    \
      memcpy(temp + 128, dst_ptr + n * BPP, r * BPP);                          \
      ANY_SIMD(temp, temp + 128, MASK + 1);                                    \
      memcpy(dst_ptr + n * BPP, temp + 128, r * BPP);                          \
    }

#ifdef HAS_ARGBCOPYALPHAROW_AVX2
ANY11B(ARGBCopyAlphaRow_Any_AVX2, ARGBCopyAlphaRow_AVX2, 0, 4, 4, 15)
#endif
#ifdef HAS_ARGBCOPYYTOALPHAROW_SSE2
ANY11B(ARGBCopyAlphaRow_Any_SSE2, ARGBCopyAlphaRow_SSE2, 0, 4, 4, 7)
#endif
#ifdef HAS_ARGBCOPYYTOALPHAROW_AVX2
ANY11B(ARGBCopyYToAlphaRow_Any_AVX2, ARGBCopyYToAlphaRow_AVX2, 0, 1, 4, 15)
#endif
#ifdef HAS_ARGBCOPYYTOALPHAROW_SSE2
ANY11B(ARGBCopyYToAlphaRow_Any_SSE2, ARGBCopyYToAlphaRow_SSE2, 0, 1, 4, 7)
#endif
#undef ANY11B

530
// Any 1 to 1 with parameter.
531 532
#define ANY11P(NAMEANY, ANY_SIMD, T, SBPP, BPP, MASK)                          \
    void NAMEANY(const uint8* src_ptr, uint8* dst_ptr,                         \
Frank Barchard's avatar
Frank Barchard committed
533
                 T shuffler, int width) {                                      \
534
      SIMD_ALIGNED(uint8 temp[64 * 2]);                                        \
535
      memset(temp, 0, 64);  /* for msan */                                     \
536 537 538
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
539
        ANY_SIMD(src_ptr, dst_ptr, shuffler, n);                               \
540
      }                                                                        \
541 542 543
      memcpy(temp, src_ptr + n * SBPP, r * SBPP);                              \
      ANY_SIMD(temp, temp + 64, shuffler, MASK + 1);                           \
      memcpy(dst_ptr + n * BPP, temp + 64, r * BPP);                           \
544 545 546
    }

#if defined(HAS_ARGBTORGB565DITHERROW_SSE2)
Frank Barchard's avatar
Frank Barchard committed
547
ANY11P(ARGBToRGB565DitherRow_Any_SSE2, ARGBToRGB565DitherRow_SSE2,
548
       const uint32, 4, 2, 3)
549 550
#endif
#if defined(HAS_ARGBTORGB565DITHERROW_AVX2)
Frank Barchard's avatar
Frank Barchard committed
551
ANY11P(ARGBToRGB565DitherRow_Any_AVX2, ARGBToRGB565DitherRow_AVX2,
552
       const uint32, 4, 2, 7)
553 554
#endif
#if defined(HAS_ARGBTORGB565DITHERROW_NEON)
Frank Barchard's avatar
Frank Barchard committed
555
ANY11P(ARGBToRGB565DitherRow_Any_NEON, ARGBToRGB565DitherRow_NEON,
556
       const uint32, 4, 2, 7)
557 558
#endif
#ifdef HAS_ARGBSHUFFLEROW_SSE2
559
ANY11P(ARGBShuffleRow_Any_SSE2, ARGBShuffleRow_SSE2, const uint8*, 4, 4, 3)
560 561
#endif
#ifdef HAS_ARGBSHUFFLEROW_SSSE3
562
ANY11P(ARGBShuffleRow_Any_SSSE3, ARGBShuffleRow_SSSE3, const uint8*, 4, 4, 7)
563 564
#endif
#ifdef HAS_ARGBSHUFFLEROW_AVX2
565
ANY11P(ARGBShuffleRow_Any_AVX2, ARGBShuffleRow_AVX2, const uint8*, 4, 4, 15)
566 567
#endif
#ifdef HAS_ARGBSHUFFLEROW_NEON
568
ANY11P(ARGBShuffleRow_Any_NEON, ARGBShuffleRow_NEON, const uint8*, 4, 4, 3)
569 570 571
#endif
#undef ANY11P

572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606
// Any 1 to 1 interpolate.  Takes 2 rows of source via stride.
#define ANY11T(NAMEANY, ANY_SIMD, SBPP, BPP, MASK)                             \
    void NAMEANY(uint8* dst_ptr, const uint8* src_ptr,                         \
                 ptrdiff_t src_stride_ptr, int width,                          \
                 int source_y_fraction) {                                      \
      SIMD_ALIGNED(uint8 temp[64 * 3]);                                        \
      memset(temp, 0, 64 * 2);  /* for msan */                                 \
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
        ANY_SIMD(dst_ptr, src_ptr, src_stride_ptr, n, source_y_fraction);      \
      }                                                                        \
      memcpy(temp, src_ptr + n * SBPP, r * SBPP);                              \
      memcpy(temp + 64, src_ptr + src_stride_ptr + n * SBPP, r * SBPP);        \
      ANY_SIMD(temp + 128, temp, 64, MASK + 1, source_y_fraction);             \
      memcpy(dst_ptr + n * BPP, temp + 128, r * BPP);                          \
    }

#ifdef HAS_INTERPOLATEROW_AVX2
ANY11T(InterpolateRow_Any_AVX2, InterpolateRow_AVX2, 1, 1, 31)
#endif
#ifdef HAS_INTERPOLATEROW_SSSE3
ANY11T(InterpolateRow_Any_SSSE3, InterpolateRow_SSSE3, 1, 1, 15)
#endif
#ifdef HAS_INTERPOLATEROW_SSE2
ANY11T(InterpolateRow_Any_SSE2, InterpolateRow_SSE2, 1, 1, 15)
#endif
#ifdef HAS_INTERPOLATEROW_NEON
ANY11T(InterpolateRow_Any_NEON, InterpolateRow_NEON, 1, 1, 15)
#endif
#ifdef HAS_INTERPOLATEROW_MIPS_DSPR2
ANY11T(InterpolateRow_Any_MIPS_DSPR2, InterpolateRow_MIPS_DSPR2, 1, 1, 3)
#endif
#undef ANY11T

607
// Any 1 to 1 mirror.
608
#define ANY11M(NAMEANY, ANY_SIMD, BPP, MASK)                                   \
609
    void NAMEANY(const uint8* src_ptr, uint8* dst_ptr, int width) {            \
610 611
      SIMD_ALIGNED(uint8 temp[64 * 2]);                                        \
      memset(temp, 0, 64);  /* for msan */                                     \
612 613 614
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
615
        ANY_SIMD(src_ptr + r * BPP, dst_ptr, n);                               \
616
      }                                                                        \
617 618 619
      memcpy(temp, src_ptr, r * BPP);                                          \
      ANY_SIMD(temp, temp + 64, MASK + 1);                                     \
      memcpy(dst_ptr + n * BPP, temp + 64 + (MASK + 1 - r) * BPP, r * BPP);    \
620 621 622
    }

#ifdef HAS_MIRRORROW_AVX2
623
ANY11M(MirrorRow_Any_AVX2, MirrorRow_AVX2, 1, 31)
624 625
#endif
#ifdef HAS_MIRRORROW_SSSE3
626
ANY11M(MirrorRow_Any_SSSE3, MirrorRow_SSSE3, 1, 15)
627 628
#endif
#ifdef HAS_MIRRORROW_NEON
629
ANY11M(MirrorRow_Any_NEON, MirrorRow_NEON, 1, 15)
630 631
#endif
#ifdef HAS_ARGBMIRRORROW_AVX2
632
ANY11M(ARGBMirrorRow_Any_AVX2, ARGBMirrorRow_AVX2, 4, 7)
633 634
#endif
#ifdef HAS_ARGBMIRRORROW_SSE2
635
ANY11M(ARGBMirrorRow_Any_SSE2, ARGBMirrorRow_SSE2, 4, 3)
636 637
#endif
#ifdef HAS_ARGBMIRRORROW_NEON
638
ANY11M(ARGBMirrorRow_Any_NEON, ARGBMirrorRow_NEON, 4, 3)
639 640 641
#endif
#undef ANY11M

642 643 644
// Any 1 plane. (memset)
#define ANY1(NAMEANY, ANY_SIMD, T, BPP, MASK)                                  \
    void NAMEANY(uint8* dst_ptr, T v32, int width) {                           \
645 646 647 648
      SIMD_ALIGNED(uint8 temp[64]);                                            \
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
649
        ANY_SIMD(dst_ptr, v32, n);                                             \
650
      }                                                                        \
651 652
      ANY_SIMD(temp, v32, MASK + 1);                                           \
      memcpy(dst_ptr + n * BPP, temp, r * BPP);                                \
653 654 655 656 657 658 659 660 661 662 663 664 665
    }

#ifdef HAS_SETROW_X86
ANY1(SetRow_Any_X86, SetRow_X86, uint8, 1, 3)
#endif
#ifdef HAS_SETROW_NEON
ANY1(SetRow_Any_NEON, SetRow_NEON, uint8, 1, 15)
#endif
#ifdef HAS_ARGBSETROW_NEON
ANY1(ARGBSetRow_Any_NEON, ARGBSetRow_NEON, uint32, 4, 3)
#endif
#undef ANY1

666 667 668
// Any 1 to 2.  Outputs UV planes.
#define ANY12(NAMEANY, ANY_SIMD, UVSHIFT, BPP, DUVSHIFT, MASK)                 \
    void NAMEANY(const uint8* src_ptr, uint8* dst_u, uint8* dst_v, int width) {\
Frank Barchard's avatar
Frank Barchard committed
669 670
      SIMD_ALIGNED(uint8 temp[128 * 3]);                                       \
      memset(temp, 0, 128);  /* for msan */                                    \
671 672 673
      int r = width & MASK;                                                    \
      int n = width & ~MASK;                                                   \
      if (n > 0) {                                                             \
674
        ANY_SIMD(src_ptr, dst_u, dst_v, n);                                    \
675
      }                                                                        \
676
      memcpy(temp, src_ptr  + (n >> UVSHIFT) * BPP, SS(r, UVSHIFT) * BPP);     \
677 678 679
      /* repeat last 4 bytes for 422 subsampler */                             \
      if ((width & 1) && BPP == 4 && DUVSHIFT == 1) {                          \
        memcpy(temp + SS(r, UVSHIFT) * BPP,                                    \
680
               temp + SS(r, UVSHIFT) * BPP - BPP, BPP);                        \
681 682
      }                                                                        \
      /* repeat last 4 - 12 bytes for 411 subsampler */                        \
683
      if (((width & 3) == 1) && BPP == 4 && DUVSHIFT == 2) {                   \
684
        memcpy(temp + SS(r, UVSHIFT) * BPP,                                    \
685 686 687
               temp + SS(r, UVSHIFT) * BPP - BPP, BPP);                        \
        memcpy(temp + SS(r, UVSHIFT) * BPP + BPP,                              \
               temp + SS(r, UVSHIFT) * BPP - BPP, BPP * 2);                    \
688
      }                                                                        \
689
      if (((width & 3) == 2) && BPP == 4 && DUVSHIFT == 2) {                   \
690
        memcpy(temp + SS(r, UVSHIFT) * BPP,                                    \
691
               temp + SS(r, UVSHIFT) * BPP - BPP * 2, BPP * 2);                \
692
      }                                                                        \
693
      if (((width & 3) == 3) && BPP == 4 && DUVSHIFT == 2) {                   \
694
        memcpy(temp + SS(r, UVSHIFT) * BPP,                                    \
695
               temp + SS(r, UVSHIFT) * BPP - BPP, BPP);                        \
Frank Barchard's avatar
Frank Barchard committed
696
      }                                                                        \
Frank Barchard's avatar
Frank Barchard committed
697 698 699
      ANY_SIMD(temp, temp + 128, temp + 256, MASK + 1);                        \
      memcpy(dst_u + (n >> DUVSHIFT), temp + 128, SS(r, DUVSHIFT));            \
      memcpy(dst_v + (n >> DUVSHIFT), temp + 256, SS(r, DUVSHIFT));            \
700 701
    }

Frank Barchard's avatar
Frank Barchard committed
702
#ifdef HAS_SPLITUVROW_SSE2
Frank Barchard's avatar
Frank Barchard committed
703
ANY12(SplitUVRow_Any_SSE2, SplitUVRow_SSE2, 0, 2, 0, 15)
Frank Barchard's avatar
Frank Barchard committed
704 705
#endif
#ifdef HAS_SPLITUVROW_AVX2
Frank Barchard's avatar
Frank Barchard committed
706
ANY12(SplitUVRow_Any_AVX2, SplitUVRow_AVX2, 0, 2, 0, 31)
Frank Barchard's avatar
Frank Barchard committed
707 708
#endif
#ifdef HAS_SPLITUVROW_NEON
Frank Barchard's avatar
Frank Barchard committed
709
ANY12(SplitUVRow_Any_NEON, SplitUVRow_NEON, 0, 2, 0, 15)
Frank Barchard's avatar
Frank Barchard committed
710 711
#endif
#ifdef HAS_SPLITUVROW_MIPS_DSPR2
Frank Barchard's avatar
Frank Barchard committed
712
ANY12(SplitUVRow_Any_MIPS_DSPR2, SplitUVRow_MIPS_DSPR2, 0, 2, 0, 15)
Frank Barchard's avatar
Frank Barchard committed
713
#endif
714
#ifdef HAS_ARGBTOUV444ROW_SSSE3
Frank Barchard's avatar
Frank Barchard committed
715
ANY12(ARGBToUV444Row_Any_SSSE3, ARGBToUV444Row_SSSE3, 0, 4, 0, 15)
716 717
#endif
#ifdef HAS_YUY2TOUV422ROW_AVX2
Frank Barchard's avatar
Frank Barchard committed
718 719
ANY12(YUY2ToUV422Row_Any_AVX2, YUY2ToUV422Row_AVX2, 1, 4, 1, 31)
ANY12(UYVYToUV422Row_Any_AVX2, UYVYToUV422Row_AVX2, 1, 4, 1, 31)
720 721
#endif
#ifdef HAS_ARGBTOUV422ROW_SSSE3
722
ANY12(ARGBToUV422Row_Any_SSSE3, ARGBToUV422Row_SSSE3, 0, 4, 1, 15)
723 724
#endif
#ifdef HAS_YUY2TOUV422ROW_SSE2
Frank Barchard's avatar
Frank Barchard committed
725 726
ANY12(YUY2ToUV422Row_Any_SSE2, YUY2ToUV422Row_SSE2, 1, 4, 1, 15)
ANY12(UYVYToUV422Row_Any_SSE2, UYVYToUV422Row_SSE2, 1, 4, 1, 15)
727
#endif
728
#ifdef HAS_YUY2TOUV422ROW_NEON
729 730 731
ANY12(ARGBToUV444Row_Any_NEON, ARGBToUV444Row_NEON, 0, 4, 0, 7)
ANY12(ARGBToUV422Row_Any_NEON, ARGBToUV422Row_NEON, 0, 4, 1, 15)
ANY12(ARGBToUV411Row_Any_NEON, ARGBToUV411Row_NEON, 0, 4, 2, 31)
Frank Barchard's avatar
Frank Barchard committed
732 733
ANY12(YUY2ToUV422Row_Any_NEON, YUY2ToUV422Row_NEON, 1, 4, 1, 15)
ANY12(UYVYToUV422Row_Any_NEON, UYVYToUV422Row_NEON, 1, 4, 1, 15)
734 735
#endif
#undef ANY12
736

737
// Any 1 to 2 with source stride (2 rows of source).  Outputs UV planes.
738
// 128 byte row allows for 32 avx ARGB pixels.
739 740
#define ANY12S(NAMEANY, ANY_SIMD, UVSHIFT, BPP, MASK)                          \
    void NAMEANY(const uint8* src_ptr, int src_stride_ptr,                     \
741
                 uint8* dst_u, uint8* dst_v, int width) {                      \
742 743
      SIMD_ALIGNED(uint8 temp[128 * 4]);                                       \
      memset(temp, 0, 128 * 2);  /* for msan */                                \
744
      int r = width & MASK;                                                    \
745
      int n = width & ~MASK;                                                   \
746
      if (n > 0) {                                                             \
747 748 749
        ANY_SIMD(src_ptr, src_stride_ptr, dst_u, dst_v, n);                    \
      }                                                                        \
      memcpy(temp, src_ptr  + (n >> UVSHIFT) * BPP, SS(r, UVSHIFT) * BPP);     \
750
      memcpy(temp + 128, src_ptr  + src_stride_ptr + (n >> UVSHIFT) * BPP,     \
751
             SS(r, UVSHIFT) * BPP);                                            \
752
      if ((width & 1) && UVSHIFT == 0) {  /* repeat last pixel for subsample */\
753
        memcpy(temp + SS(r, UVSHIFT) * BPP,                                    \
754
               temp + SS(r, UVSHIFT) * BPP - BPP, BPP);                        \
755
        memcpy(temp + 128 + SS(r, UVSHIFT) * BPP,                              \
756
               temp + 128 + SS(r, UVSHIFT) * BPP - BPP, BPP);                  \
757
      }                                                                        \
758 759 760
      ANY_SIMD(temp, 128, temp + 256, temp + 384, MASK + 1);                   \
      memcpy(dst_u + (n >> 1), temp + 256, SS(r, 1));                          \
      memcpy(dst_v + (n >> 1), temp + 384, SS(r, 1));                          \
761 762
    }

763
#ifdef HAS_ARGBTOUVROW_AVX2
764
ANY12S(ARGBToUVRow_Any_AVX2, ARGBToUVRow_AVX2, 0, 4, 31)
765
#endif
766
#ifdef HAS_ARGBTOUVROW_SSSE3
767 768 769 770 771
ANY12S(ARGBToUVRow_Any_SSSE3, ARGBToUVRow_SSSE3, 0, 4, 15)
ANY12S(ARGBToUVJRow_Any_SSSE3, ARGBToUVJRow_SSSE3, 0, 4, 15)
ANY12S(BGRAToUVRow_Any_SSSE3, BGRAToUVRow_SSSE3, 0, 4, 15)
ANY12S(ABGRToUVRow_Any_SSSE3, ABGRToUVRow_SSSE3, 0, 4, 15)
ANY12S(RGBAToUVRow_Any_SSSE3, RGBAToUVRow_SSSE3, 0, 4, 15)
772
#endif
773
#ifdef HAS_YUY2TOUVROW_AVX2
774 775
ANY12S(YUY2ToUVRow_Any_AVX2, YUY2ToUVRow_AVX2, 1, 4, 31)
ANY12S(UYVYToUVRow_Any_AVX2, UYVYToUVRow_AVX2, 1, 4, 31)
776
#endif
777
#ifdef HAS_YUY2TOUVROW_SSE2
778 779
ANY12S(YUY2ToUVRow_Any_SSE2, YUY2ToUVRow_SSE2, 1, 4, 15)
ANY12S(UYVYToUVRow_Any_SSE2, UYVYToUVRow_SSE2, 1, 4, 15)
780
#endif
fbarchard@google.com's avatar
fbarchard@google.com committed
781
#ifdef HAS_ARGBTOUVROW_NEON
782
ANY12S(ARGBToUVRow_Any_NEON, ARGBToUVRow_NEON, 0, 4, 15)
783 784
#endif
#ifdef HAS_ARGBTOUVJROW_NEON
785
ANY12S(ARGBToUVJRow_Any_NEON, ARGBToUVJRow_NEON, 0, 4, 15)
786 787
#endif
#ifdef HAS_BGRATOUVROW_NEON
788
ANY12S(BGRAToUVRow_Any_NEON, BGRAToUVRow_NEON, 0, 4, 15)
789 790
#endif
#ifdef HAS_ABGRTOUVROW_NEON
791
ANY12S(ABGRToUVRow_Any_NEON, ABGRToUVRow_NEON, 0, 4, 15)
792 793
#endif
#ifdef HAS_RGBATOUVROW_NEON
794
ANY12S(RGBAToUVRow_Any_NEON, RGBAToUVRow_NEON, 0, 4, 15)
795 796
#endif
#ifdef HAS_RGB24TOUVROW_NEON
797
ANY12S(RGB24ToUVRow_Any_NEON, RGB24ToUVRow_NEON, 0, 3, 15)
798 799
#endif
#ifdef HAS_RAWTOUVROW_NEON
800
ANY12S(RAWToUVRow_Any_NEON, RAWToUVRow_NEON, 0, 3, 15)
801 802
#endif
#ifdef HAS_RGB565TOUVROW_NEON
803
ANY12S(RGB565ToUVRow_Any_NEON, RGB565ToUVRow_NEON, 0, 2, 15)
804 805
#endif
#ifdef HAS_ARGB1555TOUVROW_NEON
806
ANY12S(ARGB1555ToUVRow_Any_NEON, ARGB1555ToUVRow_NEON, 0, 2, 15)
807 808
#endif
#ifdef HAS_ARGB4444TOUVROW_NEON
809
ANY12S(ARGB4444ToUVRow_Any_NEON, ARGB4444ToUVRow_NEON, 0, 2, 15)
810 811
#endif
#ifdef HAS_YUY2TOUVROW_NEON
812
ANY12S(YUY2ToUVRow_Any_NEON, YUY2ToUVRow_NEON, 1, 4, 15)
813 814
#endif
#ifdef HAS_UYVYTOUVROW_NEON
815
ANY12S(UYVYToUVRow_Any_NEON, UYVYToUVRow_NEON, 1, 4, 15)
816
#endif
817
#undef ANY12S
818 819 820 821 822

#ifdef __cplusplus
}  // extern "C"
}  // namespace libyuv
#endif