188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org/*
288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  Copyright 2011 The LibYuv Project Authors. All rights reserved.
388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *
488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  Use of this source code is governed by a BSD-style license
588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  that can be found in the LICENSE file in the root of the source
688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  tree. An additional intellectual property rights grant can be found
788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  in the file PATENTS. All contributing project authors may
888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org *  be found in the AUTHORS file in the root of the source tree.
988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org */
1088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
1141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org#include "libyuv/row.h"
1288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
1388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef __cplusplus
1488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgnamespace libyuv {
1588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgextern "C" {
1688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
1788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
1888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// This module is for GCC Neon
1988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#if !defined(LIBYUV_DISABLE_NEON) && defined(__ARM_NEON__)
2088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
2188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 Y, 4 U and 4 V from 422
2288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READYUV422                                                             \
2341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)                                                               \
2488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0]!                    \n"                             \
2541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)                                                               \
2688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.32    {d2[0]}, [%1]!                 \n"                             \
2741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)                                                               \
2888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.32    {d2[1]}, [%2]!                 \n"
2988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
3088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 Y, 2 U and 2 V from 422
3188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READYUV411                                                             \
3241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)                                                               \
3388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0]!                    \n"                             \
3441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)                                                               \
3588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.16    {d2[0]}, [%1]!                 \n"                             \
3641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)                                                               \
3788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.16    {d2[1]}, [%2]!                 \n"                             \
3888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, d2                         \n"                             \
3988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vzip.u8    d2, d3                         \n"
4088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
4188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 Y, 8 U and 8 V from 444
4288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READYUV444                                                             \
4341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)                                                               \
4488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0]!                    \n"                             \
4541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)                                                               \
4688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%1]!                    \n"                             \
4741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)                                                               \
4888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d3}, [%2]!                    \n"                             \
4988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"                             \
5088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshrn.u16 d2, q1, #1                     \n"
5188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
5288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 Y, and set 4 U and 4 V to 128
5388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READYUV400                                                             \
5441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)                                                               \
5588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0]!                    \n"                             \
5688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d2, #128                       \n"
5788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
5888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 Y and 4 UV from NV12
5988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READNV12                                                               \
6041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)                                                               \
6188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0]!                    \n"                             \
6241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)                                                               \
6388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%1]!                    \n"                             \
6488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, d2                         \n"/* split odd/even uv apart */\
6588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vuzp.u8    d2, d3                         \n"                             \
6688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u32   d2, d3                         \n"
6788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
6888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 Y and 4 VU from NV21
6988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READNV21                                                               \
7041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)                                                               \
7188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0]!                    \n"                             \
7241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)                                                               \
7388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%1]!                    \n"                             \
7488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, d2                         \n"/* split odd/even uv apart */\
7588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vuzp.u8    d3, d2                         \n"                             \
7688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u32   d2, d3                         \n"
7788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
7888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 YUY2
7988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READYUY2                                                               \
8041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)                                                               \
8188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld2.8     {d0, d2}, [%0]!                \n"                             \
8288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, d2                         \n"                             \
8388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vuzp.u8    d2, d3                         \n"                             \
8488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u32   d2, d3                         \n"
8588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
8688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Read 8 UYVY
8788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define READUYVY                                                               \
8841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)                                                               \
8988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld2.8     {d2, d3}, [%0]!                \n"                             \
9088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d0, d3                         \n"                             \
9188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, d2                         \n"                             \
9288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vuzp.u8    d2, d3                         \n"                             \
9388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u32   d2, d3                         \n"
9488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
9588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define YUV422TORGB                                                            \
9688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "veor.u8    d2, d26                        \n"/*subtract 128 from u and v*/\
9788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.s8   q8, d2, d24                    \n"/*  u/v B/R component      */\
9888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.s8   q9, d2, d25                    \n"/*  u/v G component        */\
9988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d1, #0                         \n"/*  split odd/even y apart */\
10088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u8    d0, d1                         \n"                             \
10188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vsub.s16   q0, q0, q15                    \n"/*  offset y               */\
10288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q0, q0, q14                    \n"                             \
10388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.s16   d18, d19                       \n"                             \
10488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  d20, d0, d16                   \n" /* B */                     \
10588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  d21, d1, d16                   \n"                             \
10688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  d22, d0, d17                   \n" /* R */                     \
10788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  d23, d1, d17                   \n"                             \
10888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  d16, d0, d18                   \n" /* G */                     \
10988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  d17, d1, d18                   \n"                             \
11088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrun.s16 d0, q10, #6                   \n" /* B */                     \
11188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrun.s16 d1, q11, #6                   \n" /* G */                     \
11288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrun.s16 d2, q8, #6                    \n" /* R */                     \
11388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q10, d0                        \n"/*  set up for reinterleave*/\
11488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q11, d1                        \n"                             \
11588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q8, d2                         \n"                             \
11688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u8    d20, d21                       \n"                             \
11788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u8    d22, d23                       \n"                             \
11888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u8    d16, d17                       \n"                             \
11988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d21, d16                       \n"
12088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
12188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic vec8 kUVToRB  = { 127, 127, 127, 127, 102, 102, 102, 102,
12288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         0, 0, 0, 0, 0, 0, 0, 0 };
12388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgstatic vec8 kUVToG = { -25, -25, -25, -25, -52, -52, -52, -52,
12488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       0, 0, 0, 0, 0, 0, 0, 0 };
12588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
12688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I444ToARGBRow_NEON(const uint8* src_y,
12788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
12888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
12988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb,
13088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
13188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
13241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
13388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
13441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
13588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
13688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
13788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
13888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
13988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
14088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
14188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV444
14288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
14388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
14488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
14541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
14688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%3]!    \n"
14788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
14888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
14988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),     // %1
15088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),     // %2
15188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %3
15288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %4
15388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %5
15488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %6
15588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
15688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
15788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
15888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
15988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
16088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToARGBRow_NEON(const uint8* src_y,
16188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
16288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
16388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb,
16488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
16588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
16641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
16788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
16841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
16988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
17088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
17188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
17288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
17388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
17488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
17588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
17688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
17788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
17888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
17941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
18088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%3]!    \n"
18188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
18288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
18388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),     // %1
18488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),     // %2
18588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %3
18688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %4
18788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %5
18888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %6
18988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
19088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
19188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
19288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
19388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
19488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I411ToARGBRow_NEON(const uint8* src_y,
19588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
19688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
19788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb,
19888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
19988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
20041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
20188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
20241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
20388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
20488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
20588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
20688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
20788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
20888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
20988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV411
21088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
21188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
21288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
21341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
21488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%3]!    \n"
21588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
21688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
21788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),     // %1
21888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),     // %2
21988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %3
22088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %4
22188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %5
22288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %6
22388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
22488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
22588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
22688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
22788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
22888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToBGRARow_NEON(const uint8* src_y,
22988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
23088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
23188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_bgra,
23288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
23388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
23441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
23588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
23641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
23788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
23888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
23988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
24088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
24188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
24288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
24388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
24488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
24588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
24688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vswp.u8    d20, d22                       \n"
24788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d19, #255                      \n"
24841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
24988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d19, d20, d21, d22}, [%3]!    \n"
25088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
25188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
25288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),     // %1
25388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),     // %2
25488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_bgra),  // %3
25588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %4
25688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %5
25788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %6
25888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
25988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
26088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
26188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
26288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
26388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToABGRRow_NEON(const uint8* src_y,
26488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
26588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
26688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_abgr,
26788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
26888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
26941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
27088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
27141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
27288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
27388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
27488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
27588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
27688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
27788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
27888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
27988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
28088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
28188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vswp.u8    d20, d22                       \n"
28288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
28341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
28488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%3]!    \n"
28588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
28688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
28788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),     // %1
28888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),     // %2
28988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_abgr),  // %3
29088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %4
29188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %5
29288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %6
29388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
29488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
29588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
29688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
29788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
29888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRGBARow_NEON(const uint8* src_y,
29988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
30088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
30188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_rgba,
30288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
30388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
30441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
30588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
30641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
30788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
30888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
30988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
31088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
31188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
31288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
31388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
31488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
31588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
31688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d19, #255                      \n"
31741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
31888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d19, d20, d21, d22}, [%3]!    \n"
31988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
32088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
32188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),     // %1
32288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),     // %2
32388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_rgba),  // %3
32488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %4
32588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %5
32688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %6
32788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
32888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
32988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
33088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
33188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
33288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRGB24Row_NEON(const uint8* src_y,
33388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* src_u,
33488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* src_v,
33588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint8* dst_rgb24,
33688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int width) {
33788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
33841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
33988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
34041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
34188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
34288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
34388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
34488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
34588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
34688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
34788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
34888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
34988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
35041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
35188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst3.8     {d20, d21, d22}, [%3]!         \n"
35288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
35388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),      // %0
35488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),      // %1
35588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),      // %2
35688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_rgb24),  // %3
35788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)       // %4
35888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),    // %5
35988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)      // %6
36088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
36188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
36288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
36388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
36488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
36588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRAWRow_NEON(const uint8* src_y,
36688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       const uint8* src_u,
36788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       const uint8* src_v,
36888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_raw,
36988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       int width) {
37088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
37141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
37288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
37341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
37488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
37588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
37688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
37788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
37888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
37988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
38088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
38188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
38288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
38388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vswp.u8    d20, d22                       \n"
38441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
38588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst3.8     {d20, d21, d22}, [%3]!         \n"
38688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
38788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),    // %0
38888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),    // %1
38988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),    // %2
39088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_raw),  // %3
39188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)     // %4
39288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),  // %5
39388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)    // %6
39488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
39588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
39688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
39788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
39888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
39988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define ARGBTORGB565                                                           \
40088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d20, d20, #3                   \n"  /* B                    */ \
40188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d21, d21, #2                   \n"  /* G                    */ \
40288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d22, d22, #3                   \n"  /* R                    */ \
40388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q8, d20                        \n"  /* B                    */ \
40488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q9, d21                        \n"  /* G                    */ \
40588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q10, d22                       \n"  /* R                    */ \
40688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u16   q9, q9, #5                     \n"  /* G                    */ \
40788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u16   q10, q10, #11                  \n"  /* R                    */ \
40888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr       q0, q8, q9                     \n"  /* BG                   */ \
40988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr       q0, q0, q10                    \n"  /* BGR                  */
41088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
41188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToRGB565Row_NEON(const uint8* src_y,
41288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          const uint8* src_u,
41388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          const uint8* src_v,
41488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_rgb565,
41588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int width) {
41688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
41741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
41888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
41941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
42088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
42188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
42288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
42388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
42488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
42588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
42688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
42788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
42888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
42988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGBTORGB565
43041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
43188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%3]!                    \n"  // store 8 pixels RGB565.
43288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
43388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),    // %0
43488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),    // %1
43588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),    // %2
43688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_rgb565),  // %3
43788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)     // %4
43888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),  // %5
43988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)    // %6
44088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
44188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
44288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
44388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
44488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
44588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define ARGBTOARGB1555                                                         \
44688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    q10, q10, #3                   \n"  /* B                    */ \
44788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d22, d22, #3                   \n"  /* R                    */ \
44888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d23, d23, #7                   \n"  /* A                    */ \
44988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q8, d20                        \n"  /* B                    */ \
45088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q9, d21                        \n"  /* G                    */ \
45188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q10, d22                       \n"  /* R                    */ \
45288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q11, d23                       \n"  /* A                    */ \
45388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u16   q9, q9, #5                     \n"  /* G                    */ \
45488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u16   q10, q10, #10                  \n"  /* R                    */ \
45588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u16   q11, q11, #15                  \n"  /* A                    */ \
45688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr       q0, q8, q9                     \n"  /* BG                   */ \
45788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr       q1, q10, q11                   \n"  /* RA                   */ \
45888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr       q0, q0, q1                     \n"  /* BGRA                 */
45988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
46088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToARGB1555Row_NEON(const uint8* src_y,
46188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            const uint8* src_u,
46288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            const uint8* src_v,
46388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            uint8* dst_argb1555,
46488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int width) {
46588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
46641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
46788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
46841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
46988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
47088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
47188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
47288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
47388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
47488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
47588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
47688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
47788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
47888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
47988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGBTOARGB1555
48041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
48188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%3]!                    \n"  // store 8 pixels ARGB1555.
48288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
48388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),    // %0
48488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),    // %1
48588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),    // %2
48688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb1555),  // %3
48788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)     // %4
48888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),  // %5
48988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)    // %6
49088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
49188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
49288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
49388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
49488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
49588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define ARGBTOARGB4444                                                         \
49688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d20, d20, #4                   \n"  /* B                    */ \
49788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vbic.32    d21, d21, d4                   \n"  /* G                    */ \
49888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d22, d22, #4                   \n"  /* R                    */ \
49988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vbic.32    d23, d23, d4                   \n"  /* A                    */ \
50088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr       d0, d20, d21                   \n"  /* BG                   */ \
50188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr       d1, d22, d23                   \n"  /* RA                   */ \
50288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vzip.u8    d0, d1                         \n"  /* BGRA                 */
50388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
50488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToARGB4444Row_NEON(const uint8* src_y,
50588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            const uint8* src_u,
50688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            const uint8* src_v,
50788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            uint8* dst_argb4444,
50888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int width) {
50988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
51041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
51188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%5]                    \n"
51241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(6)
51388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%6]                    \n"
51488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
51588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
51688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
51788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #0x0f                      \n"  // bits to clear with vbic.
51888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
51988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
52088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV422
52188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
52288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"
52388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
52488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGBTOARGB4444
52541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
52688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%3]!                    \n"  // store 8 pixels ARGB4444.
52788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
52888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),    // %0
52988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),    // %1
53088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),    // %2
53188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb4444),  // %3
53288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)     // %4
53388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),  // %5
53488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)    // %6
53588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
53688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
53788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
53888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
53988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
54088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YToARGBRow_NEON(const uint8* src_y,
54188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_argb,
54288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     int width) {
54388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
54441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
54588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%3]                    \n"
54641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(4)
54788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%4]                    \n"
54888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
54988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
55088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
55188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
55288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
55388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUV400
55488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
55588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"
55688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
55741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
55888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%1]!    \n"
55988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
56088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
56188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %1
56288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %2
56388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %3
56488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %4
56588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
56688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
56788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
56888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
56988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
57088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I400ToARGBRow_NEON(const uint8* src_y,
57188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb,
57288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
57388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
57488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
57588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
57688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
57741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
57888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d20}, [%0]!                   \n"
57988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov       d21, d20                       \n"
58088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov       d22, d20                       \n"
58188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"
58241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
58388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%1]!    \n"
58488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
58588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
58688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %1
58788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %2
58888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    :
58988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "d20", "d21", "d22", "d23"
59088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
59188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
59288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
59388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid NV12ToARGBRow_NEON(const uint8* src_y,
59488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_uv,
59588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb,
59688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
59788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
59841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(4)
59988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%4]                    \n"
60041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
60188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%5]                    \n"
60288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
60388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
60488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
60588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
60688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
60788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READNV12
60888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
60988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"
61088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
61141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
61288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%2]!    \n"
61388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
61488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
61588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_uv),    // %1
61688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %2
61788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %3
61888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %4
61988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %5
62088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
62188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
62288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
62388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
62488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
62588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid NV21ToARGBRow_NEON(const uint8* src_y,
62688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_uv,
62788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb,
62888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
62988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
63041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(4)
63188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%4]                    \n"
63241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
63388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%5]                    \n"
63488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
63588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
63688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
63788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
63888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
63988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READNV21
64088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
64188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"
64288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
64341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
64488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%2]!    \n"
64588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
64688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
64788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_uv),    // %1
64888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %2
64988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %3
65088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %4
65188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %5
65288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
65388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
65488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
65588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
65688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
65788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid NV12ToRGB565Row_NEON(const uint8* src_y,
65888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          const uint8* src_uv,
65988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_rgb565,
66088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int width) {
66188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
66241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(4)
66388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%4]                    \n"
66441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
66588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%5]                    \n"
66688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
66788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
66888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
66988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
67088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
67188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READNV12
67288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
67388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"
67488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGBTORGB565
67541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
67688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%2]!                    \n"  // store 8 pixels RGB565.
67788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
67888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
67988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_uv),    // %1
68088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_rgb565),  // %2
68188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %3
68288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %4
68388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %5
68488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
68588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
68688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
68788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
68888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
68988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid NV21ToRGB565Row_NEON(const uint8* src_y,
69088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          const uint8* src_uv,
69188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_rgb565,
69288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int width) {
69388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
69441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(4)
69588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%4]                    \n"
69641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(5)
69788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%5]                    \n"
69888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
69988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
70088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
70188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
70288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
70388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READNV21
70488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
70588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"
70688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGBTORGB565
70741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
70888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%2]!                    \n"  // store 8 pixels RGB565.
70988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
71088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_y),     // %0
71188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_uv),    // %1
71288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_rgb565),  // %2
71388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %3
71488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %4
71588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %5
71688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
71788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
71888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
71988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
72088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
72188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToARGBRow_NEON(const uint8* src_yuy2,
72288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb,
72388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
72488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
72541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
72688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%3]                    \n"
72741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(4)
72888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%4]                    \n"
72988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
73088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
73188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
73288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
73388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
73488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READYUY2
73588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
73688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"
73788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
73841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
73988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%1]!    \n"
74088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
74188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_yuy2),  // %0
74288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %1
74388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %2
74488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %3
74588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %4
74688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
74788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
74888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
74988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
75088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
75188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToARGBRow_NEON(const uint8* src_uyvy,
75288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_argb,
75388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        int width) {
75488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
75541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
75688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d24}, [%3]                    \n"
75741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(4)
75888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d25}, [%4]                    \n"
75988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #128                      \n"
76088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q14, #74                       \n"
76188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #16                       \n"
76288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
76388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
76488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    READUYVY
76588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    YUV422TORGB
76688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"
76788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d23, #255                      \n"
76841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
76988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d21, d22, d23}, [%1]!    \n"
77088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
77188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_uyvy),  // %0
77288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_argb),  // %1
77388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)      // %2
77488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "r"(&kUVToRB),   // %3
77588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "r"(&kUVToG)     // %4
77688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1", "q2", "q3",
77788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
77888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
77988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
78088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
78188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Reads 16 pairs of UV and write even values to dst_u and odd to dst_v.
78288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SplitUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
78388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     int width) {
78488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
78588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
78688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
78741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
78888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld2.8     {q0, q1}, [%0]!                \n"  // load 16 pairs of UV
78988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"  // 16 processed per loop
79041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
79188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%1]!                    \n"  // store U
79241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
79388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q1}, [%2]!                    \n"  // store V
79488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
79588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "+r"(src_uv),  // %0
79688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_u),   // %1
79788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_v),   // %2
79888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)    // %3  // Output registers
79988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    :                       // Input registers
80088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1"  // Clobber List
80188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
80288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
80388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
80488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Reads 16 U's and V's and writes out 16 pairs of UV.
80588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MergeUVRow_NEON(const uint8* src_u, const uint8* src_v, uint8* dst_uv,
80688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     int width) {
80788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
80888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
80988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
81041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
81188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load U
81241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
81388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q1}, [%1]!                    \n"  // load V
81488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"  // 16 processed per loop
81541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
81688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst2.u8    {q0, q1}, [%2]!                \n"  // store 16 pairs of UV
81788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
81888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    :
81988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_u),   // %0
82088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(src_v),   // %1
82188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(dst_uv),  // %2
82288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org      "+r"(width)    // %3  // Output registers
82388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    :                       // Input registers
82488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    : "cc", "memory", "q0", "q1"  // Clobber List
82588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
82688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
82788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
82888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Copy multiple of 32.  vld4.8  allow unaligned and is fastest on a15.
82988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid CopyRow_NEON(const uint8* src, uint8* dst, int count) {
83088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
83188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
83288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
83341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
83488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 32
83588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #32                    \n"  // 32 processed per loop
83641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
83788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0, d1, d2, d3}, [%1]!        \n"  // store 32
83888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
83988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src),   // %0
84088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst),   // %1
84188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(count)  // %2  // Output registers
84288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :                     // Input registers
84388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"  // Clobber List
84488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
84588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
84688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
84788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SetRow8 writes 'count' bytes using a 32 bit value repeated.
84888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SetRow_NEON(uint8* dst, uint32 v32, int count) {
84988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
85088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vdup.u32  q0, %2                          \n"  // duplicate 4 ints
85188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "1:                                        \n"
85288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs      %1, %1, #16                     \n"  // 16 bytes per loop
85341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
85488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8    {q0}, [%0]!                     \n"  // store
85588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt       1b                              \n"
85688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(dst),   // %0
85788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(count)  // %1
85888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "r"(v32)     // %2
85988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0"
86088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
86188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
86288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
86388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): Make fully assembler
86488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SetRow32 writes 'count' words using a 32 bit value repeated.
86588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBSetRows_NEON(uint8* dst, uint32 v32, int width,
86688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      int dst_stride, int height) {
86788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  for (int y = 0; y < height; ++y) {
86888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    SetRow_NEON(dst, v32, width << 2);
86988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    dst += dst_stride;
87088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  }
87188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
87288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
87388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MirrorRow_NEON(const uint8* src, uint8* dst, int width) {
87488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
87588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Start at end of source row.
87688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "mov        r3, #-16                       \n"
87788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %0, %0, %2                     \n"
87888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "sub        %0, #16                        \n"
87988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
88088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
88188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
88241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
88388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0], r3                 \n"  // src -= 16
88488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, #16                        \n"  // 16 pixels per loop.
88588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrev64.8   q0, q0                         \n"
88641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
88788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%1]!                    \n"  // dst += 16
88841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
88988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"
89088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
89188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src),   // %0
89288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst),   // %1
89388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)  // %2
89488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
89588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "r3", "q0"
89688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
89788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
89888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
89988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid MirrorUVRow_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v,
90088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      int width) {
90188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
90288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Start at end of source row.
90388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "mov        r12, #-16                      \n"
90488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %0, %0, %3, lsl #1             \n"
90588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "sub        %0, #16                        \n"
90688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
90788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
90888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
90941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
91088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld2.8     {d0, d1}, [%0], r12            \n"  // src -= 16
91188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, #8                         \n"  // 8 pixels per loop.
91288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrev64.8   q0, q0                         \n"
91341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
91488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // dst += 8
91541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
91688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%2]!                    \n"
91788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
91888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_uv),  // %0
91988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),   // %1
92088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),   // %2
92188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)    // %3
92288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
92388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "r12", "q0"
92488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
92588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
92688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
92788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBMirrorRow_NEON(const uint8* src, uint8* dst, int width) {
92888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
92988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Start at end of source row.
93088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "mov        r3, #-16                       \n"
93188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %0, %0, %2, lsl #2             \n"
93288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "sub        %0, #16                        \n"
93388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
93488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
93588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
93641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
93788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0], r3                 \n"  // src -= 16
93888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, #4                         \n"  // 4 pixels per loop.
93988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrev64.32  q0, q0                         \n"
94041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
94188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%1]!                    \n"  // dst += 16
94241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
94388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"
94488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
94588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src),   // %0
94688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst),   // %1
94788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)  // %2
94888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
94988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "r3", "q0"
95088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
95188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
95288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
95388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGB24ToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int pix) {
95488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
95588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #255                       \n"  // Alpha
95688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
95788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
95841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
95988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d1, d2, d3}, [%0]!            \n"  // load 8 pixels of RGB24.
96088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
96141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
96288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d1, d2, d3, d4}, [%1]!        \n"  // store 8 pixels of ARGB.
96388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
96488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_rgb24),  // %0
96588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),   // %1
96688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)         // %2
96788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
96888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d1", "d2", "d3", "d4"  // Clobber List
96988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
97088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
97188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
97288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RAWToARGBRow_NEON(const uint8* src_raw, uint8* dst_argb, int pix) {
97388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
97488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #255                       \n"  // Alpha
97588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
97688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
97741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
97888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d1, d2, d3}, [%0]!            \n"  // load 8 pixels of RAW.
97988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
98088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vswp.u8    d1, d3                         \n"  // swap R, B
98141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
98288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d1, d2, d3, d4}, [%1]!        \n"  // store 8 pixels of ARGB.
98388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
98488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_raw),   // %0
98588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),  // %1
98688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
98788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
98888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d1", "d2", "d3", "d4"  // Clobber List
98988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
99088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
99188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
99288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define RGB565TOARGB                                                           \
99388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshrn.u16  d6, q0, #5                     \n"  /* G xxGGGGGG           */ \
99488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vuzp.u8    d0, d1                         \n"  /* d0 xxxBBBBB RRRRRxxx */ \
99588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u8    d6, d6, #2                     \n"  /* G GGGGGG00 upper 6   */ \
99688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d1, d1, #3                     \n"  /* R 000RRRRR lower 5   */ \
99788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u8    q0, q0, #3                     \n"  /* B,R BBBBB000 upper 5 */ \
99888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    q2, q0, #5                     \n"  /* B,R 00000BBB lower 3 */ \
99988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    d0, d0, d4                     \n"  /* B                    */ \
100088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d4, d6, #6                     \n"  /* G 000000GG lower 2   */ \
100188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    d2, d1, d5                     \n"  /* R                    */ \
100288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    d1, d4, d6                     \n"  /* G                    */
100388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
100488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGB565ToARGBRow_NEON(const uint8* src_rgb565, uint8* dst_argb, int pix) {
100588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
100688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, #255                       \n"  // Alpha
100788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
100888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
100941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
101088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 RGB565 pixels.
101188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
101288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB565TOARGB
101341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
101488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%1]!        \n"  // store 8 pixels of ARGB.
101588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
101688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_rgb565),  // %0
101788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),    // %1
101888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)          // %2
101988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
102088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3"  // Clobber List
102188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
102288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
102388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
102488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define ARGB1555TOARGB                                                         \
102588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshrn.u16  d7, q0, #8                     \n"  /* A Arrrrrxx           */ \
102688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d6, d7, #2                     \n"  /* R xxxRRRRR           */ \
102788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshrn.u16  d5, q0, #5                     \n"  /* G xxxGGGGG           */ \
102888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovn.u16  d4, q0                         \n"  /* B xxxBBBBB           */ \
102988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d7, d7, #7                     \n"  /* A 0000000A           */ \
103088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vneg.s8    d7, d7                         \n"  /* A AAAAAAAA upper 8   */ \
103188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u8    d6, d6, #3                     \n"  /* R RRRRR000 upper 5   */ \
103288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    q1, q3, #5                     \n"  /* R,A 00000RRR lower 3 */ \
103388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u8    q0, q2, #3                     \n"  /* B,G BBBBB000 upper 5 */ \
103488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    q2, q0, #5                     \n"  /* B,G 00000BBB lower 3 */ \
103588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    q1, q1, q3                     \n"  /* R,A                  */ \
103688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    q0, q0, q2                     \n"  /* B,G                  */ \
103788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
103888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// RGB555TOARGB is same as ARGB1555TOARGB but ignores alpha.
103988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define RGB555TOARGB                                                           \
104088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshrn.u16  d6, q0, #5                     \n"  /* G xxxGGGGG           */ \
104188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vuzp.u8    d0, d1                         \n"  /* d0 xxxBBBBB xRRRRRxx */ \
104288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u8    d6, d6, #3                     \n"  /* G GGGGG000 upper 5   */ \
104388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d1, d1, #2                     \n"  /* R 00xRRRRR lower 5   */ \
104488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u8    q0, q0, #3                     \n"  /* B,R BBBBB000 upper 5 */ \
104588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    q2, q0, #5                     \n"  /* B,R 00000BBB lower 3 */ \
104688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    d0, d0, d4                     \n"  /* B                    */ \
104788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    d4, d6, #5                     \n"  /* G 00000GGG lower 3   */ \
104888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    d2, d1, d5                     \n"  /* R                    */ \
104988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    d1, d4, d6                     \n"  /* G                    */
105088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
105188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGB1555ToARGBRow_NEON(const uint8* src_argb1555, uint8* dst_argb,
105288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int pix) {
105388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
105488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, #255                       \n"  // Alpha
105588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
105688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
105741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
105888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 ARGB1555 pixels.
105988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
106088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGB1555TOARGB
106141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
106288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%1]!        \n"  // store 8 pixels of ARGB.
106388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
106488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb1555),  // %0
106588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),    // %1
106688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)          // %2
106788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
106888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3"  // Clobber List
106988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
107088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
107188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
107288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define ARGB4444TOARGB                                                         \
107388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vuzp.u8    d0, d1                         \n"  /* d0 BG, d1 RA         */ \
107488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u8    q2, q0, #4                     \n"  /* B,R BBBB0000         */ \
107588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    q1, q0, #4                     \n"  /* G,A 0000GGGG         */ \
107688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u8    q0, q2, #4                     \n"  /* B,R 0000BBBB         */ \
107788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    q0, q0, q2                     \n"  /* B,R BBBBBBBB         */ \
107888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshl.u8    q2, q1, #4                     \n"  /* G,A GGGG0000         */ \
107988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vorr.u8    q1, q1, q2                     \n"  /* G,A GGGGGGGG         */ \
108088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vswp.u8    d1, d2                         \n"  /* B,R,G,A -> B,G,R,A   */
108188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
108288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGB4444ToARGBRow_NEON(const uint8* src_argb4444, uint8* dst_argb,
108388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int pix) {
108488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
108588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, #255                       \n"  // Alpha
108688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
108788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
108841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
108988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 ARGB4444 pixels.
109088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
109188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGB4444TOARGB
109241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
109388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%1]!        \n"  // store 8 pixels of ARGB.
109488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
109588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb4444),  // %0
109688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),    // %1
109788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)          // %2
109888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
109988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2"  // Clobber List
110088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
110188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
110288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
110388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb24, int pix) {
110488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
110588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
110688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
110741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
110888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d2, d3, d4}, [%0]!        \n"  // load 8 pixels of ARGB.
110988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
111041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
111188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst3.8     {d1, d2, d3}, [%1]!            \n"  // store 8 pixels of RGB24.
111288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
111388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),   // %0
111488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_rgb24),  // %1
111588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)         // %2
111688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
111788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d1", "d2", "d3", "d4"  // Clobber List
111888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
111988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
112088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
112188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToRAWRow_NEON(const uint8* src_argb, uint8* dst_raw, int pix) {
112288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
112388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
112488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
112541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
112688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d2, d3, d4}, [%0]!        \n"  // load 8 pixels of ARGB.
112788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
112888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vswp.u8    d1, d3                         \n"  // swap R, B
112941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
113088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst3.8     {d1, d2, d3}, [%1]!            \n"  // store 8 pixels of RAW.
113188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
113288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
113388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_raw),   // %1
113488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
113588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
113688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d1", "d2", "d3", "d4"  // Clobber List
113788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
113888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
113988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
114088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToYRow_NEON(const uint8* src_yuy2, uint8* dst_y, int pix) {
114188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
114288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
114388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
114441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
114588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld2.8     {q0, q1}, [%0]!                \n"  // load 16 pixels of YUY2.
114688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #16                    \n"  // 16 processed per loop.
114741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
114888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%1]!                    \n"  // store 16 pixels of Y.
114988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
115088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_yuy2),  // %0
115188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),     // %1
115288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
115388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
115488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"  // Clobber List
115588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
115688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
115788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
115888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToYRow_NEON(const uint8* src_uyvy, uint8* dst_y, int pix) {
115988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
116088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
116188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
116241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
116388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld2.8     {q0, q1}, [%0]!                \n"  // load 16 pixels of UYVY.
116488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #16                    \n"  // 16 processed per loop.
116541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
116688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q1}, [%1]!                    \n"  // store 16 pixels of Y.
116788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
116888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_uyvy),  // %0
116988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),     // %1
117088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
117188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
117288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"  // Clobber List
117388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
117488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
117588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
117688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToUV422Row_NEON(const uint8* src_yuy2, uint8* dst_u, uint8* dst_v,
117788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int pix) {
117888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
117988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
118088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
118141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
118288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 16 pixels of YUY2.
118388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"  // 16 pixels = 8 UVs.
118441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
118588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%1]!                    \n"  // store 8 U.
118641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
118788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d3}, [%2]!                    \n"  // store 8 V.
118888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
118988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_yuy2),  // %0
119088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %1
119188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %2
119288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %3
119388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
119488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3"  // Clobber List
119588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
119688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
119788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
119888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToUV422Row_NEON(const uint8* src_uyvy, uint8* dst_u, uint8* dst_v,
119988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int pix) {
120088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
120188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
120288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
120341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
120488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 16 pixels of UYVY.
120588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"  // 16 pixels = 8 UVs.
120641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
120788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 U.
120841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
120988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d2}, [%2]!                    \n"  // store 8 V.
121088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
121188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_uyvy),  // %0
121288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %1
121388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %2
121488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %3
121588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
121688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3"  // Clobber List
121788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
121888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
121988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
122088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid YUY2ToUVRow_NEON(const uint8* src_yuy2, int stride_yuy2,
122188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
122288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
122388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // stride + src_yuy2
122488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
122588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
122641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
122788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 16 pixels of YUY2.
122888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 16 pixels = 8 UVs.
122941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
123088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d4, d5, d6, d7}, [%1]!        \n"  // load next row YUY2.
123188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  d1, d1, d5                     \n"  // average rows of U
123288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  d3, d3, d7                     \n"  // average rows of V
123341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
123488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%2]!                    \n"  // store 8 U.
123541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
123688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d3}, [%3]!                    \n"  // store 8 V.
123788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
123888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_yuy2),     // %0
123988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(stride_yuy2),  // %1
124088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),        // %2
124188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),        // %3
124288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)           // %4
124388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
124488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7"  // Clobber List
124588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
124688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
124788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
124888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy,
124988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
125088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
125188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // stride + src_uyvy
125288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
125388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
125441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
125588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 16 pixels of UYVY.
125688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 16 pixels = 8 UVs.
125741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
125888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d4, d5, d6, d7}, [%1]!        \n"  // load next row UYVY.
125988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  d0, d0, d4                     \n"  // average rows of U
126088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  d2, d2, d6                     \n"  // average rows of V
126141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
126288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 U.
126341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
126488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d2}, [%3]!                    \n"  // store 8 V.
126588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
126688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_uyvy),     // %0
126788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(stride_uyvy),  // %1
126888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),        // %2
126988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),        // %3
127088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)           // %4
127188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
127288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7"  // Clobber List
127388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
127488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
127588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
127688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid HalfRow_NEON(const uint8* src_uv, int src_uv_stride,
127788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                  uint8* dst_uv, int pix) {
127888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
127988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // change the stride to row 2 pointer
128088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0                         \n"
128188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
128241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
128388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load row 1 16 pixels.
128488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"  // 16 processed per loop
128541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
128688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q1}, [%1]!                    \n"  // load row 2 16 pixels.
128788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  q0, q1                         \n"  // average row 1 and 2
128841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
128988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%2]!                    \n"
129088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
129188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_uv),         // %0
129288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_uv_stride),  // %1
129388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_uv),         // %2
129488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)             // %3
129588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
129688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"  // Clobber List
129788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
129888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
129988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
130088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Select 2 channels from ARGB on alternating pixels.  e.g.  BGBGBGBG
130188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToBayerRow_NEON(const uint8* src_argb, uint8* dst_bayer,
130288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         uint32 selector, int pix) {
130388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
130488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u32   d6[0], %3                      \n"  // selector
130588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
130641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
130788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0, q1}, [%0]!                \n"  // load row 8 pixels.
130888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop
130988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtbl.8     d4, {d0, d1}, d6               \n"  // look up 4 pixels
131088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtbl.8     d5, {d2, d3}, d6               \n"  // look up 4 pixels
131188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtrn.u32   d4, d5                         \n"  // combine 8 pixels
131241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
131388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d4}, [%1]!                    \n"  // store 8.
131488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
131588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),   // %0
131688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_bayer),  // %1
131788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)         // %2
131888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "r"(selector)     // %3
131988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3"  // Clobber List
132088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
132188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
132288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
132388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Select G channels from ARGB.  e.g.  GGGGGGGG
132488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToBayerGGRow_NEON(const uint8* src_argb, uint8* dst_bayer,
132588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                           uint32 /*selector*/, int pix) {
132688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
132788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
132841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
132988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load row 8 pixels.
133088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop
133141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
133288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%1]!                    \n"  // store 8 G's.
133388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
133488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),   // %0
133588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_bayer),  // %1
133688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)         // %2
133788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
133888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"  // Clobber List
133988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
134088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
134188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
134288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// For BGRAToARGB, ABGRToARGB, RGBAToARGB, and ARGBToRGBA.
134388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBShuffleRow_NEON(const uint8* src_argb, uint8* dst_argb,
134488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* shuffler, int pix) {
134588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
134641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
134788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q2}, [%3]                     \n"  // shuffler
134888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
134941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
135088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 4 pixels.
135188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #4                     \n"  // 4 processed per loop
135288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtbl.8     d2, {d0, d1}, d4               \n"  // look up 2 first pixels
135388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vtbl.8     d3, {d0, d1}, d5               \n"  // look up 2 next pixels
135441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
135588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q1}, [%1]!                    \n"  // store 4.
135688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
135788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
135888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),  // %1
135988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
136088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "r"(shuffler)    // %3
136188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2"  // Clobber List
136288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
136388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
136488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
136588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToYUY2Row_NEON(const uint8* src_y,
136688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
136788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
136888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_yuy2, int width) {
136988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
137088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
137188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
137241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
137388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld2.8     {d0, d2}, [%0]!                \n"  // load 16 Ys
137441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
137588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d1}, [%1]!                    \n"  // load 8 Us
137641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
137788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d3}, [%2]!                    \n"  // load 8 Vs
137888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 16 pixels
137941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
138088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%3]!        \n"  // Store 8 YUY2/16 pixels.
138188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
138288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_y),     // %0
138388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_u),     // %1
138488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_v),     // %2
138588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_yuy2),  // %3
138688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)      // %4
138788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
138888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3"
138988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
139088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
139188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
139288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid I422ToUYVYRow_NEON(const uint8* src_y,
139388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_u,
139488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        const uint8* src_v,
139588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_uyvy, int width) {
139688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
139788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
139888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
139941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
140088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld2.8     {d1, d3}, [%0]!                \n"  // load 16 Ys
140141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
140288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%1]!                    \n"  // load 8 Us
140341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
140488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%2]!                    \n"  // load 8 Vs
140588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 16 pixels
140641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
140788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%3]!        \n"  // Store 8 UYVY/16 pixels.
140888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
140988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_y),     // %0
141088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_u),     // %1
141188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_v),     // %2
141288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_uyvy),  // %3
141388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)      // %4
141488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
141588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3"
141688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
141788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
141888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
141988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToRGB565Row_NEON(const uint8* src_argb, uint8* dst_rgb565, int pix) {
142088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
142188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
142288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
142341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
142488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d20, d21, d22, d23}, [%0]!    \n"  // load 8 pixels of ARGB.
142588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
142688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGBTORGB565
142741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
142888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%1]!                    \n"  // store 8 pixels RGB565.
142988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
143088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
143188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_rgb565),  // %1
143288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
143388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
143488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q8", "q9", "q10", "q11"
143588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
143688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
143788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
143888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToARGB1555Row_NEON(const uint8* src_argb, uint8* dst_argb1555,
143988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int pix) {
144088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
144188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
144288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
144341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
144488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d20, d21, d22, d23}, [%0]!    \n"  // load 8 pixels of ARGB.
144588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
144688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGBTOARGB1555
144741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
144888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%1]!                    \n"  // store 8 pixels ARGB1555.
144988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
145088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
145188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb1555),  // %1
145288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
145388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
145488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q8", "q9", "q10", "q11"
145588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
145688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
145788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
145888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToARGB4444Row_NEON(const uint8* src_argb, uint8* dst_argb4444,
145988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                            int pix) {
146088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
146188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #0x0f                      \n"  // bits to clear with vbic.
146288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
146388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
146441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
146588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d20, d21, d22, d23}, [%0]!    \n"  // load 8 pixels of ARGB.
146688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
146788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGBTOARGB4444
146841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
146988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%1]!                    \n"  // store 8 pixels ARGB4444.
147088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
147188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),      // %0
147288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb4444),  // %1
147388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)            // %2
147488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
147588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q8", "q9", "q10", "q11"
147688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
147788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
147888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
147988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToYRow_NEON(const uint8* src_argb, uint8* dst_y, int pix) {
148088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
148188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d24, #13                       \n"  // B * 0.1016 coefficient
148288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d25, #65                       \n"  // G * 0.5078 coefficient
148388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #33                       \n"  // R * 0.2578 coefficient
148488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d27, #16                       \n"  // Add 16 constant
148588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
148688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
148741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
148888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 ARGB pixels.
148988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
149088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d0, d24                    \n"  // B
149188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d1, d25                    \n"  // G
149288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d2, d26                    \n"  // R
149388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q2, #7                   \n"  // 16 bit to 8 bit Y
149488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d27                        \n"
149541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
149688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
149788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
149888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
149988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),     // %1
150088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
150188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
150288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q12", "q13"
150388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
150488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
150588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
150688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToYJRow_NEON(const uint8* src_argb, uint8* dst_y, int pix) {
150788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
150888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d24, #15                       \n"  // B * 0.11400 coefficient
150988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d25, #75                       \n"  // G * 0.58700 coefficient
151088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #38                       \n"  // R * 0.29900 coefficient
151188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
151288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
151341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
151488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 ARGB pixels.
151588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
151688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d0, d24                    \n"  // B
151788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d1, d25                    \n"  // G
151888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d2, d26                    \n"  // R
151988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q2, #7                   \n"  // 15 bit to 8 bit Y
152041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
152188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
152288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
152388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
152488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),     // %1
152588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
152688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
152788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q12", "q13"
152888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
152988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
153088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
153188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 8x1 pixels.
153288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUV444Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
153388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int pix) {
153488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
153588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d24, #112                      \n"  // UB / VR 0.875 coefficient
153688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d25, #74                       \n"  // UG -0.5781 coefficient
153788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #38                       \n"  // UR -0.2969 coefficient
153888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d27, #18                       \n"  // VB -0.1406 coefficient
153988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d28, #94                       \n"  // VG -0.7344 coefficient
154088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
154188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
154288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
154341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
154488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 ARGB pixels.
154588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"  // 8 processed per loop.
154688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d0, d24                    \n"  // B
154788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlsl.u8   q2, d1, d25                    \n"  // G
154888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlsl.u8   q2, d2, d26                    \n"  // R
154988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q2, q2, q15                    \n"  // +128 -> unsigned
155088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
155188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q3, d2, d24                    \n"  // R
155288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlsl.u8   q3, d1, d28                    \n"  // G
155388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlsl.u8   q3, d0, d27                    \n"  // B
155488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q3, q3, q15                    \n"  // +128 -> unsigned
155588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
155688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d0, q2, #8                    \n"  // 16 bit to 8 bit U
155788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d1, q3, #8                    \n"  // 16 bit to 8 bit V
155888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
155941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
156088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels U.
156141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
156288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%2]!                    \n"  // store 8 pixels V.
156388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
156488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
156588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %1
156688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %2
156788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %3
156888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
156988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q12", "q13", "q14", "q15"
157088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
157188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
157288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
157388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 16x1 pixels -> 8x1.  pix is number of argb pixels. e.g. 16.
157488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUV422Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
157588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int pix) {
157688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
157788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
157888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
157988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
158088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
158188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
158288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
158388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
158488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
158541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
158688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]!        \n"  // load 8 ARGB pixels.
158741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
158888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d3, d5, d7}, [%0]!        \n"  // load next 8 ARGB pixels.
158988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
159088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q0, q0                         \n"  // B 16 bytes -> 8 shorts.
159188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"  // G 16 bytes -> 8 shorts.
159288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q2                         \n"  // R 16 bytes -> 8 shorts.
159388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
159488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"  // 16 processed per loop.
159588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q8, q0, q10                    \n"  // B
159688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q1, q11                    \n"  // G
159788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q2, q12                    \n"  // R
159888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q8, q8, q15                    \n"  // +128 -> unsigned
159988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
160088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q9, q2, q10                    \n"  // R
160188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q1, q14                    \n"  // G
160288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q0, q13                    \n"  // B
160388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q9, q9, q15                    \n"  // +128 -> unsigned
160488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
160588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d0, q8, #8                    \n"  // 16 bit to 8 bit U
160688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d1, q9, #8                    \n"  // 16 bit to 8 bit V
160788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
160841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
160988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels U.
161041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
161188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%2]!                    \n"  // store 8 pixels V.
161288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
161388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
161488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %1
161588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %2
161688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %3
161788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
161888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3",
161988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
162088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
162188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
162288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
162388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 32x1 pixels -> 8x1.  pix is number of argb pixels. e.g. 32.
162488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUV411Row_NEON(const uint8* src_argb, uint8* dst_u, uint8* dst_v,
162588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int pix) {
162688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
162788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
162888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
162988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
163088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
163188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
163288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
163388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
163488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
163541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
163688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]!        \n"  // load 8 ARGB pixels.
163741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
163888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d3, d5, d7}, [%0]!        \n"  // load next 8 ARGB pixels.
163988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q0, q0                         \n"  // B 16 bytes -> 8 shorts.
164088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"  // G 16 bytes -> 8 shorts.
164188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q2                         \n"  // R 16 bytes -> 8 shorts.
164241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
164388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d8, d10, d12, d14}, [%0]!     \n"  // load 8 more ARGB pixels.
164441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
164588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d9, d11, d13, d15}, [%0]!     \n"  // load last 8 ARGB pixels.
164688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q4, q4                         \n"  // B 16 bytes -> 8 shorts.
164788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q5, q5                         \n"  // G 16 bytes -> 8 shorts.
164888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q6, q6                         \n"  // R 16 bytes -> 8 shorts.
164988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
165088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadd.u16  d0, d0, d1                     \n"  // B 16 shorts -> 8 shorts.
165188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadd.u16  d1, d8, d9                     \n"  // B
165288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadd.u16  d2, d2, d3                     \n"  // G 16 shorts -> 8 shorts.
165388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadd.u16  d3, d10, d11                   \n"  // G
165488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadd.u16  d4, d4, d5                     \n"  // R 16 shorts -> 8 shorts.
165588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadd.u16  d5, d12, d13                   \n"  // R
165688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
165788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q0, q0, #1                     \n"  // 2x average
165888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q1, q1, #1                     \n"
165988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q2, q2, #1                     \n"
166088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
166188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #32                    \n"  // 32 processed per loop.
166288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q8, q0, q10                    \n"  // B
166388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q1, q11                    \n"  // G
166488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q2, q12                    \n"  // R
166588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q8, q8, q15                    \n"  // +128 -> unsigned
166688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q9, q2, q10                    \n"  // R
166788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q1, q14                    \n"  // G
166888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q0, q13                    \n"  // B
166988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q9, q9, q15                    \n"  // +128 -> unsigned
167088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d0, q8, #8                    \n"  // 16 bit to 8 bit U
167188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d1, q9, #8                    \n"  // 16 bit to 8 bit V
167241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
167388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels U.
167441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
167588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%2]!                    \n"  // store 8 pixels V.
167688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
167788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
167888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %1
167988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %2
168088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %3
168188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
168288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
168388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
168488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
168588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
168688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
168788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 16x2 pixels -> 8x1.  pix is number of argb pixels. e.g. 16.
168888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#define RGBTOUV(QB, QG, QR) \
168988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q8, " #QB ", q10               \n"  /* B                    */ \
169088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, " #QG ", q11               \n"  /* G                    */ \
169188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, " #QR ", q12               \n"  /* R                    */ \
169288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q8, q8, q15                    \n"  /* +128 -> unsigned     */ \
169388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q9, " #QR ", q10               \n"  /* R                    */ \
169488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, " #QG ", q14               \n"  /* G                    */ \
169588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, " #QB ", q13               \n"  /* B                    */ \
169688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q9, q9, q15                    \n"  /* +128 -> unsigned     */ \
169788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d0, q8, #8                    \n"  /* 16 bit to 8 bit U    */ \
169888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d1, q9, #8                    \n"  /* 16 bit to 8 bit V    */
169988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
170088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): Consider vhadd vertical, then vpaddl horizontal, avoid shr.
170188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUVRow_NEON(const uint8* src_argb, int src_stride_argb,
170288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
170388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
170488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_argb
170588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
170688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
170788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
170888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
170988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
171088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
171188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
171288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
171341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
171488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]!        \n"  // load 8 ARGB pixels.
171541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
171688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d3, d5, d7}, [%0]!        \n"  // load next 8 ARGB pixels.
171788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q0, q0                         \n"  // B 16 bytes -> 8 shorts.
171888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"  // G 16 bytes -> 8 shorts.
171988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q2                         \n"  // R 16 bytes -> 8 shorts.
172041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
172188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d8, d10, d12, d14}, [%1]!     \n"  // load 8 more ARGB pixels.
172241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
172388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d9, d11, d13, d15}, [%1]!     \n"  // load last 8 ARGB pixels.
172488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q0, q4                         \n"  // B 16 bytes -> 8 shorts.
172588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q1, q5                         \n"  // G 16 bytes -> 8 shorts.
172688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q2, q6                         \n"  // R 16 bytes -> 8 shorts.
172788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
172888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q0, q0, #1                     \n"  // 2x average
172988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q1, q1, #1                     \n"
173088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q2, q2, #1                     \n"
173188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
173288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 32 processed per loop.
173388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGBTOUV(q0, q1, q2)
173441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
173588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
173641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
173788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
173888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
173988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
174088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_argb),  // %1
174188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
174288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
174388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
174488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
174588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
174688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
174788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
174888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
174988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
175088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): Subsample match C code.
175188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBToUVJRow_NEON(const uint8* src_argb, int src_stride_argb,
175288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_u, uint8* dst_v, int pix) {
175388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
175488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_argb
175588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #127 / 2                  \n"  // UB / VR 0.500 coefficient
175688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #84 / 2                   \n"  // UG -0.33126 coefficient
175788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #43 / 2                   \n"  // UR -0.16874 coefficient
175888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #20 / 2                   \n"  // VB -0.08131 coefficient
175988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #107 / 2                  \n"  // VG -0.41869 coefficient
176088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
176188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
176288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
176341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
176488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]!        \n"  // load 8 ARGB pixels.
176541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
176688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d3, d5, d7}, [%0]!        \n"  // load next 8 ARGB pixels.
176788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q0, q0                         \n"  // B 16 bytes -> 8 shorts.
176888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"  // G 16 bytes -> 8 shorts.
176988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q2                         \n"  // R 16 bytes -> 8 shorts.
177041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
177188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d8, d10, d12, d14}, [%1]!     \n"  // load 8 more ARGB pixels.
177241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
177388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d9, d11, d13, d15}, [%1]!     \n"  // load last 8 ARGB pixels.
177488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q0, q4                         \n"  // B 16 bytes -> 8 shorts.
177588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q1, q5                         \n"  // G 16 bytes -> 8 shorts.
177688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q2, q6                         \n"  // R 16 bytes -> 8 shorts.
177788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
177888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q0, q0, #1                     \n"  // 2x average
177988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q1, q1, #1                     \n"
178088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q2, q2, #1                     \n"
178188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
178288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 32 processed per loop.
178388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGBTOUV(q0, q1, q2)
178441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
178588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
178641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
178788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
178888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
178988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
179088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_argb),  // %1
179188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
179288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
179388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
179488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
179588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
179688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
179788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
179888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
179988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
180088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid BGRAToUVRow_NEON(const uint8* src_bgra, int src_stride_bgra,
180188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
180288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
180388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_bgra
180488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
180588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
180688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
180788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
180888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
180988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
181088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
181188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
181241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
181388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]!        \n"  // load 8 BGRA pixels.
181441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
181588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d3, d5, d7}, [%0]!        \n"  // load next 8 BGRA pixels.
181688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q3, q3                         \n"  // B 16 bytes -> 8 shorts.
181788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q2                         \n"  // G 16 bytes -> 8 shorts.
181888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"  // R 16 bytes -> 8 shorts.
181941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
182088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d8, d10, d12, d14}, [%1]!     \n"  // load 8 more BGRA pixels.
182141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
182288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d9, d11, d13, d15}, [%1]!     \n"  // load last 8 BGRA pixels.
182388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q3, q7                         \n"  // B 16 bytes -> 8 shorts.
182488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q2, q6                         \n"  // G 16 bytes -> 8 shorts.
182588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q1, q5                         \n"  // R 16 bytes -> 8 shorts.
182688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
182788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q1, q1, #1                     \n"  // 2x average
182888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q2, q2, #1                     \n"
182988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q3, q3, #1                     \n"
183088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
183188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 32 processed per loop.
183288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGBTOUV(q3, q2, q1)
183341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
183488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
183541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
183688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
183788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
183888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_bgra),  // %0
183988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_bgra),  // %1
184088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
184188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
184288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
184388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
184488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
184588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
184688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
184788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
184888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
184988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ABGRToUVRow_NEON(const uint8* src_abgr, int src_stride_abgr,
185088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
185188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
185288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_abgr
185388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
185488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
185588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
185688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
185788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
185888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
185988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
186088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
186141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
186288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]!        \n"  // load 8 ABGR pixels.
186341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
186488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d3, d5, d7}, [%0]!        \n"  // load next 8 ABGR pixels.
186588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q2                         \n"  // B 16 bytes -> 8 shorts.
186688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"  // G 16 bytes -> 8 shorts.
186788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q0, q0                         \n"  // R 16 bytes -> 8 shorts.
186841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
186988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d8, d10, d12, d14}, [%1]!     \n"  // load 8 more ABGR pixels.
187041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
187188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d9, d11, d13, d15}, [%1]!     \n"  // load last 8 ABGR pixels.
187288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q2, q6                         \n"  // B 16 bytes -> 8 shorts.
187388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q1, q5                         \n"  // G 16 bytes -> 8 shorts.
187488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q0, q4                         \n"  // R 16 bytes -> 8 shorts.
187588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
187688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q0, q0, #1                     \n"  // 2x average
187788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q1, q1, #1                     \n"
187888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q2, q2, #1                     \n"
187988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
188088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 32 processed per loop.
188188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGBTOUV(q2, q1, q0)
188241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
188388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
188441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
188588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
188688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
188788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_abgr),  // %0
188888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_abgr),  // %1
188988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
189088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
189188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
189288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
189388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
189488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
189588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
189688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
189788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
189888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGBAToUVRow_NEON(const uint8* src_rgba, int src_stride_rgba,
189988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                      uint8* dst_u, uint8* dst_v, int pix) {
190088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
190188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_rgba
190288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
190388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
190488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
190588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
190688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
190788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
190888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
190988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
191041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
191188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]!        \n"  // load 8 RGBA pixels.
191241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
191388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d3, d5, d7}, [%0]!        \n"  // load next 8 RGBA pixels.
191488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q0, q1                         \n"  // B 16 bytes -> 8 shorts.
191588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q2                         \n"  // G 16 bytes -> 8 shorts.
191688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q3                         \n"  // R 16 bytes -> 8 shorts.
191741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
191888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d8, d10, d12, d14}, [%1]!     \n"  // load 8 more RGBA pixels.
191941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
192088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d9, d11, d13, d15}, [%1]!     \n"  // load last 8 RGBA pixels.
192188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q0, q5                         \n"  // B 16 bytes -> 8 shorts.
192288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q1, q6                         \n"  // G 16 bytes -> 8 shorts.
192388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q2, q7                         \n"  // R 16 bytes -> 8 shorts.
192488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
192588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q0, q0, #1                     \n"  // 2x average
192688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q1, q1, #1                     \n"
192788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q2, q2, #1                     \n"
192888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
192988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 32 processed per loop.
193088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGBTOUV(q0, q1, q2)
193141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
193288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
193341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
193488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
193588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
193688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_rgba),  // %0
193788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_rgba),  // %1
193888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
193988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
194088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
194188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
194288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
194388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
194488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
194588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
194688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
194788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGB24ToUVRow_NEON(const uint8* src_rgb24, int src_stride_rgb24,
194888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_u, uint8* dst_v, int pix) {
194988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
195088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_rgb24
195188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
195288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
195388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
195488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
195588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
195688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
195788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
195888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
195941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
196088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d0, d2, d4}, [%0]!            \n"  // load 8 RGB24 pixels.
196141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
196288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d1, d3, d5}, [%0]!            \n"  // load next 8 RGB24 pixels.
196388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q0, q0                         \n"  // B 16 bytes -> 8 shorts.
196488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"  // G 16 bytes -> 8 shorts.
196588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q2                         \n"  // R 16 bytes -> 8 shorts.
196641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
196788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d8, d10, d12}, [%1]!          \n"  // load 8 more RGB24 pixels.
196841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
196988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d9, d11, d13}, [%1]!          \n"  // load last 8 RGB24 pixels.
197088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q0, q4                         \n"  // B 16 bytes -> 8 shorts.
197188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q1, q5                         \n"  // G 16 bytes -> 8 shorts.
197288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q2, q6                         \n"  // R 16 bytes -> 8 shorts.
197388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
197488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q0, q0, #1                     \n"  // 2x average
197588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q1, q1, #1                     \n"
197688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q2, q2, #1                     \n"
197788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
197888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 32 processed per loop.
197988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGBTOUV(q0, q1, q2)
198041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
198188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
198241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
198388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
198488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
198588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_rgb24),  // %0
198688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_rgb24),  // %1
198788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
198888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
198988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
199088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
199188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
199288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
199388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
199488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
199588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
199688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RAWToUVRow_NEON(const uint8* src_raw, int src_stride_raw,
199788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_u, uint8* dst_v, int pix) {
199888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
199988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_raw
200088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
200188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
200288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
200388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
200488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
200588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
200688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
200788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
200841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
200988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d0, d2, d4}, [%0]!            \n"  // load 8 RAW pixels.
201041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
201188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d1, d3, d5}, [%0]!            \n"  // load next 8 RAW pixels.
201288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q2, q2                         \n"  // B 16 bytes -> 8 shorts.
201388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q1, q1                         \n"  // G 16 bytes -> 8 shorts.
201488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  q0, q0                         \n"  // R 16 bytes -> 8 shorts.
201541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
201688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d8, d10, d12}, [%1]!          \n"  // load 8 more RAW pixels.
201741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
201888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d9, d11, d13}, [%1]!          \n"  // load last 8 RAW pixels.
201988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q2, q6                         \n"  // B 16 bytes -> 8 shorts.
202088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q1, q5                         \n"  // G 16 bytes -> 8 shorts.
202188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  q0, q4                         \n"  // R 16 bytes -> 8 shorts.
202288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
202388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q0, q0, #1                     \n"  // 2x average
202488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q1, q1, #1                     \n"
202588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q2, q2, #1                     \n"
202688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
202788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 32 processed per loop.
202888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGBTOUV(q2, q1, q0)
202941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
203088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
203141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
203288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
203388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
203488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_raw),  // %0
203588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_raw),  // %1
203688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
203788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
203888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
203988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
204088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
204188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
204288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
204388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
204488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
204588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 16x2 pixels -> 8x1.  pix is number of argb pixels. e.g. 16.
204688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGB565ToUVRow_NEON(const uint8* src_rgb565, int src_stride_rgb565,
204788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_u, uint8* dst_v, int pix) {
204888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
204988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_argb
205088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
205188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
205288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
205388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
205488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
205588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
205688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
205788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
205841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
205988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 RGB565 pixels.
206088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB565TOARGB
206188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d8, d0                         \n"  // B 8 bytes -> 4 shorts.
206288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d10, d1                        \n"  // G 8 bytes -> 4 shorts.
206388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d12, d2                        \n"  // R 8 bytes -> 4 shorts.
206441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
206588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // next 8 RGB565 pixels.
206688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB565TOARGB
206788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d9, d0                         \n"  // B 8 bytes -> 4 shorts.
206888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d11, d1                        \n"  // G 8 bytes -> 4 shorts.
206988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d13, d2                        \n"  // R 8 bytes -> 4 shorts.
207088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
207141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
207288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"  // load 8 RGB565 pixels.
207388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB565TOARGB
207488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d8, d0                         \n"  // B 8 bytes -> 4 shorts.
207588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d10, d1                        \n"  // G 8 bytes -> 4 shorts.
207688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d12, d2                        \n"  // R 8 bytes -> 4 shorts.
207741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
207888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"  // next 8 RGB565 pixels.
207988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB565TOARGB
208088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d9, d0                         \n"  // B 8 bytes -> 4 shorts.
208188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d11, d1                        \n"  // G 8 bytes -> 4 shorts.
208288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d13, d2                        \n"  // R 8 bytes -> 4 shorts.
208388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
208488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q4, q4, #1                     \n"  // 2x average
208588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q5, q5, #1                     \n"
208688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q6, q6, #1                     \n"
208788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
208888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 16 processed per loop.
208988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q8, q4, q10                    \n"  // B
209088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q5, q11                    \n"  // G
209188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q6, q12                    \n"  // R
209288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q8, q8, q15                    \n"  // +128 -> unsigned
209388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q9, q6, q10                    \n"  // R
209488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q5, q14                    \n"  // G
209588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q4, q13                    \n"  // B
209688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q9, q9, q15                    \n"  // +128 -> unsigned
209788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d0, q8, #8                    \n"  // 16 bit to 8 bit U
209888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d1, q9, #8                    \n"  // 16 bit to 8 bit V
209941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
210088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
210141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
210288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
210388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
210488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_rgb565),  // %0
210588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_rgb565),  // %1
210688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
210788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
210888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
210988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
211088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
211188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
211288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
211388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
211488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
211588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 16x2 pixels -> 8x1.  pix is number of argb pixels. e.g. 16.
211688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGB1555ToUVRow_NEON(const uint8* src_argb1555, int src_stride_argb1555,
211788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                        uint8* dst_u, uint8* dst_v, int pix) {
211888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
211988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_argb
212088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
212188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
212288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
212388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
212488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
212588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
212688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
212788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
212841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
212988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 ARGB1555 pixels.
213088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB555TOARGB
213188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d8, d0                         \n"  // B 8 bytes -> 4 shorts.
213288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d10, d1                        \n"  // G 8 bytes -> 4 shorts.
213388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d12, d2                        \n"  // R 8 bytes -> 4 shorts.
213441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
213588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // next 8 ARGB1555 pixels.
213688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB555TOARGB
213788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d9, d0                         \n"  // B 8 bytes -> 4 shorts.
213888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d11, d1                        \n"  // G 8 bytes -> 4 shorts.
213988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d13, d2                        \n"  // R 8 bytes -> 4 shorts.
214088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
214141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
214288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"  // load 8 ARGB1555 pixels.
214388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB555TOARGB
214488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d8, d0                         \n"  // B 8 bytes -> 4 shorts.
214588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d10, d1                        \n"  // G 8 bytes -> 4 shorts.
214688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d12, d2                        \n"  // R 8 bytes -> 4 shorts.
214741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
214888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"  // next 8 ARGB1555 pixels.
214988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB555TOARGB
215088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d9, d0                         \n"  // B 8 bytes -> 4 shorts.
215188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d11, d1                        \n"  // G 8 bytes -> 4 shorts.
215288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d13, d2                        \n"  // R 8 bytes -> 4 shorts.
215388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
215488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q4, q4, #1                     \n"  // 2x average
215588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q5, q5, #1                     \n"
215688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q6, q6, #1                     \n"
215788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
215888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 16 processed per loop.
215988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q8, q4, q10                    \n"  // B
216088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q5, q11                    \n"  // G
216188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q6, q12                    \n"  // R
216288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q8, q8, q15                    \n"  // +128 -> unsigned
216388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q9, q6, q10                    \n"  // R
216488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q5, q14                    \n"  // G
216588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q4, q13                    \n"  // B
216688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q9, q9, q15                    \n"  // +128 -> unsigned
216788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d0, q8, #8                    \n"  // 16 bit to 8 bit U
216888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d1, q9, #8                    \n"  // 16 bit to 8 bit V
216941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
217088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
217141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
217288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
217388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
217488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb1555),  // %0
217588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_argb1555),  // %1
217688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
217788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
217888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
217988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
218088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
218188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
218288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
218388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
218488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
218588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// 16x2 pixels -> 8x1.  pix is number of argb pixels. e.g. 16.
218688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGB4444ToUVRow_NEON(const uint8* src_argb4444, int src_stride_argb4444,
218788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_u, uint8* dst_v, int pix) {
218888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
218988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %1, %0, %1                     \n"  // src_stride + src_argb
219088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q10, #112 / 2                  \n"  // UB / VR 0.875 coefficient
219188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q11, #74 / 2                   \n"  // UG -0.5781 coefficient
219288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q12, #38 / 2                   \n"  // UR -0.2969 coefficient
219388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q13, #18 / 2                   \n"  // VB -0.1406 coefficient
219488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.s16   q14, #94 / 2                   \n"  // VG -0.7344 coefficient
219588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u16   q15, #0x8080                   \n"  // 128.5
219688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
219788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
219841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
219988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 ARGB4444 pixels.
220088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGB4444TOARGB
220188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d8, d0                         \n"  // B 8 bytes -> 4 shorts.
220288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d10, d1                        \n"  // G 8 bytes -> 4 shorts.
220388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d12, d2                        \n"  // R 8 bytes -> 4 shorts.
220441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
220588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // next 8 ARGB4444 pixels.
220688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGB4444TOARGB
220788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d9, d0                         \n"  // B 8 bytes -> 4 shorts.
220888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d11, d1                        \n"  // G 8 bytes -> 4 shorts.
220988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpaddl.u8  d13, d2                        \n"  // R 8 bytes -> 4 shorts.
221088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
221141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
221288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"  // load 8 ARGB4444 pixels.
221388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGB4444TOARGB
221488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d8, d0                         \n"  // B 8 bytes -> 4 shorts.
221588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d10, d1                        \n"  // G 8 bytes -> 4 shorts.
221688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d12, d2                        \n"  // R 8 bytes -> 4 shorts.
221741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
221888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"  // next 8 ARGB4444 pixels.
221988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGB4444TOARGB
222088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d9, d0                         \n"  // B 8 bytes -> 4 shorts.
222188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d11, d1                        \n"  // G 8 bytes -> 4 shorts.
222288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vpadal.u8  d13, d2                        \n"  // R 8 bytes -> 4 shorts.
222388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
222488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q4, q4, #1                     \n"  // 2x average
222588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q5, q5, #1                     \n"
222688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshr.u16  q6, q6, #1                     \n"
222788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
222888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #16                    \n"  // 16 processed per loop.
222988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q8, q4, q10                    \n"  // B
223088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q5, q11                    \n"  // G
223188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q8, q6, q12                    \n"  // R
223288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q8, q8, q15                    \n"  // +128 -> unsigned
223388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q9, q6, q10                    \n"  // R
223488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q5, q14                    \n"  // G
223588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmls.s16   q9, q4, q13                    \n"  // B
223688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q9, q9, q15                    \n"  // +128 -> unsigned
223788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d0, q8, #8                    \n"  // 16 bit to 8 bit U
223888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16  d1, q9, #8                    \n"  // 16 bit to 8 bit V
223941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
224088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 pixels U.
224141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
224288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d1}, [%3]!                    \n"  // store 8 pixels V.
224388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
224488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb4444),  // %0
224588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride_argb4444),  // %1
224688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_u),     // %2
224788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_v),     // %3
224888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %4
224988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
225088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
225188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
225288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
225388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
225488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
225588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGB565ToYRow_NEON(const uint8* src_rgb565, uint8* dst_y, int pix) {
225688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
225788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d24, #13                       \n"  // B * 0.1016 coefficient
225888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d25, #65                       \n"  // G * 0.5078 coefficient
225988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #33                       \n"  // R * 0.2578 coefficient
226088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d27, #16                       \n"  // Add 16 constant
226188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
226288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
226341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
226488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 RGB565 pixels.
226588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
226688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    RGB565TOARGB
226788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d0, d24                    \n"  // B
226888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d1, d25                    \n"  // G
226988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d2, d26                    \n"  // R
227088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q2, #7                   \n"  // 16 bit to 8 bit Y
227188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d27                        \n"
227241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
227388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
227488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
227588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_rgb565),  // %0
227688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),       // %1
227788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)          // %2
227888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
227988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13"
228088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
228188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
228288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
228388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGB1555ToYRow_NEON(const uint8* src_argb1555, uint8* dst_y, int pix) {
228488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
228588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d24, #13                       \n"  // B * 0.1016 coefficient
228688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d25, #65                       \n"  // G * 0.5078 coefficient
228788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #33                       \n"  // R * 0.2578 coefficient
228888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d27, #16                       \n"  // Add 16 constant
228988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
229088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
229141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
229288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 ARGB1555 pixels.
229388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
229488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGB1555TOARGB
229588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d0, d24                    \n"  // B
229688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d1, d25                    \n"  // G
229788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d2, d26                    \n"  // R
229888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q2, #7                   \n"  // 16 bit to 8 bit Y
229988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d27                        \n"
230041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
230188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
230288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
230388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb1555),  // %0
230488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),         // %1
230588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)            // %2
230688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
230788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13"
230888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
230988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
231088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
231188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGB4444ToYRow_NEON(const uint8* src_argb4444, uint8* dst_y, int pix) {
231288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
231388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d24, #13                       \n"  // B * 0.1016 coefficient
231488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d25, #65                       \n"  // G * 0.5078 coefficient
231588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #33                       \n"  // R * 0.2578 coefficient
231688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d27, #16                       \n"  // Add 16 constant
231788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
231888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
231941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
232088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 8 ARGB4444 pixels.
232188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
232288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ARGB4444TOARGB
232388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d0, d24                    \n"  // B
232488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d1, d25                    \n"  // G
232588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d2, d26                    \n"  // R
232688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q2, #7                   \n"  // 16 bit to 8 bit Y
232788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d27                        \n"
232841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
232988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
233088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
233188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb4444),  // %0
233288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),         // %1
233388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)            // %2
233488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
233588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13"
233688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
233788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
233888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
233988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid BGRAToYRow_NEON(const uint8* src_bgra, uint8* dst_y, int pix) {
234088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
234188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #33                        \n"  // R * 0.2578 coefficient
234288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d5, #65                        \n"  // G * 0.5078 coefficient
234388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d6, #13                        \n"  // B * 0.1016 coefficient
234488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d7, #16                        \n"  // Add 16 constant
234588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
234688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
234741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
234888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 pixels of BGRA.
234988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
235088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q8, d1, d4                     \n"  // R
235188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d2, d5                     \n"  // G
235288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d3, d6                     \n"  // B
235388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q8, #7                   \n"  // 16 bit to 8 bit Y
235488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d7                         \n"
235541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
235688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
235788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
235888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_bgra),  // %0
235988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),     // %1
236088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
236188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
236288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
236388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
236488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
236588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
236688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ABGRToYRow_NEON(const uint8* src_abgr, uint8* dst_y, int pix) {
236788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
236888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #33                        \n"  // R * 0.2578 coefficient
236988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d5, #65                        \n"  // G * 0.5078 coefficient
237088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d6, #13                        \n"  // B * 0.1016 coefficient
237188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d7, #16                        \n"  // Add 16 constant
237288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
237388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
237441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
237588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 pixels of ABGR.
237688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
237788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q8, d0, d4                     \n"  // R
237888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d1, d5                     \n"  // G
237988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d2, d6                     \n"  // B
238088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q8, #7                   \n"  // 16 bit to 8 bit Y
238188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d7                         \n"
238241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
238388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
238488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
238588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_abgr),  // %0
238688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),  // %1
238788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
238888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
238988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
239088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
239188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
239288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
239388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGBAToYRow_NEON(const uint8* src_rgba, uint8* dst_y, int pix) {
239488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
239588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #13                        \n"  // B * 0.1016 coefficient
239688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d5, #65                        \n"  // G * 0.5078 coefficient
239788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d6, #33                        \n"  // R * 0.2578 coefficient
239888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d7, #16                        \n"  // Add 16 constant
239988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
240088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
240141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
240288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 pixels of RGBA.
240388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
240488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q8, d1, d4                     \n"  // B
240588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d2, d5                     \n"  // G
240688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d3, d6                     \n"  // R
240788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q8, #7                   \n"  // 16 bit to 8 bit Y
240888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d7                         \n"
240941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
241088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
241188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
241288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_rgba),  // %0
241388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),  // %1
241488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
241588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
241688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
241788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
241888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
241988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
242088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RGB24ToYRow_NEON(const uint8* src_rgb24, uint8* dst_y, int pix) {
242188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
242288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #13                        \n"  // B * 0.1016 coefficient
242388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d5, #65                        \n"  // G * 0.5078 coefficient
242488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d6, #33                        \n"  // R * 0.2578 coefficient
242588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d7, #16                        \n"  // Add 16 constant
242688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
242788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
242841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
242988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d0, d1, d2}, [%0]!            \n"  // load 8 pixels of RGB24.
243088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
243188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q8, d0, d4                     \n"  // B
243288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d1, d5                     \n"  // G
243388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d2, d6                     \n"  // R
243488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q8, #7                   \n"  // 16 bit to 8 bit Y
243588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d7                         \n"
243641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
243788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
243888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
243988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_rgb24),  // %0
244088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),  // %1
244188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
244288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
244388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
244488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
244588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
244688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
244788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid RAWToYRow_NEON(const uint8* src_raw, uint8* dst_y, int pix) {
244888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
244988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d4, #33                        \n"  // R * 0.2578 coefficient
245088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d5, #65                        \n"  // G * 0.5078 coefficient
245188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d6, #13                        \n"  // B * 0.1016 coefficient
245288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d7, #16                        \n"  // Add 16 constant
245388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
245488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
245541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
245688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld3.8     {d0, d1, d2}, [%0]!            \n"  // load 8 pixels of RAW.
245788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
245888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q8, d0, d4                     \n"  // B
245988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d1, d5                     \n"  // G
246088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d2, d6                     \n"  // R
246188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q8, #7                   \n"  // 16 bit to 8 bit Y
246288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d7                         \n"
246341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
246488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%1]!                    \n"  // store 8 pixels Y.
246588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
246688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_raw),  // %0
246788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),  // %1
246888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(pix)        // %2
246988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
247088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "q8"
247188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
247288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
247388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
247488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Bilinear filter 16x2 -> 16x1
247588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid InterpolateRow_NEON(uint8* dst_ptr,
247688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         const uint8* src_ptr, ptrdiff_t src_stride,
247788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                         int dst_width, int source_y_fraction) {
247888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
247988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "cmp        %4, #0                         \n"
248088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "beq        100f                           \n"
248188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "add        %2, %1                         \n"
248288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "cmp        %4, #64                        \n"
248388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "beq        75f                            \n"
248488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "cmp        %4, #128                       \n"
248588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "beq        50f                            \n"
248688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "cmp        %4, #192                       \n"
248788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "beq        25f                            \n"
248888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
248988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vdup.8     d5, %4                         \n"
249088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "rsb        %4, #256                       \n"
249188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vdup.8     d4, %4                         \n"
249288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // General purpose row blend.
249388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
249441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
249588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"
249641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
249788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q1}, [%2]!                    \n"
249888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"
249988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q13, d0, d4                    \n"
250088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q14, d1, d4                    \n"
250188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q13, d2, d5                    \n"
250288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q14, d3, d5                    \n"
250388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshrn.u16 d0, q13, #8                    \n"
250488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshrn.u16 d1, q14, #8                    \n"
250541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
250688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%0]!                    \n"
250788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
250888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "b          99f                            \n"
250988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
251088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 25 / 75.
251188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "25:                                         \n"
251241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
251388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"
251441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
251588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q1}, [%2]!                    \n"
251688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"
251788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  q0, q1                         \n"
251888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  q0, q1                         \n"
251941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
252088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%0]!                    \n"
252188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        25b                            \n"
252288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "b          99f                            \n"
252388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
252488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 50 / 50.
252588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "50:                                         \n"
252641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
252788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"
252841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
252988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q1}, [%2]!                    \n"
253088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"
253188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  q0, q1                         \n"
253241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
253388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%0]!                    \n"
253488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        50b                            \n"
253588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "b          99f                            \n"
253688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
253788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 75 / 25.
253888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "75:                                         \n"
253941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
254088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q1}, [%1]!                    \n"
254141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
254288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%2]!                    \n"
254388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"
254488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  q0, q1                         \n"
254588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrhadd.u8  q0, q1                         \n"
254641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
254788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%0]!                    \n"
254888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        75b                            \n"
254988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "b          99f                            \n"
255088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
255188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 100 / 0 - Copy row unchanged.
255288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "100:                                        \n"
255341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
255488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%1]!                    \n"
255588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"
255641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
255788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%0]!                    \n"
255888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        100b                           \n"
255988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
256088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "99:                                         \n"
256188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(dst_ptr),          // %0
256288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_ptr),          // %1
256388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_stride),       // %2
256488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_width),        // %3
256588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(source_y_fraction) // %4
256688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
256788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "d4", "d5", "q13", "q14"
256888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
256988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
257088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
257188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// dr * (256 - sa) / 256 + sr = dr - dr * sa / 256 + sr
257288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBBlendRow_NEON(const uint8* src_argb0, const uint8* src_argb1,
257388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint8* dst_argb, int width) {
257488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
257588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, #8                         \n"
257688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "blt        89f                            \n"
257788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 8 pixels.
257888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "8:                                          \n"
257941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
258088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 pixels of ARGB0.
258141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
258288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d4, d5, d6, d7}, [%1]!        \n"  // load 8 pixels of ARGB1.
258388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"  // 8 processed per loop.
258488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q10, d4, d3                    \n"  // db * a
258588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q11, d5, d3                    \n"  // dg * a
258688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q12, d6, d3                    \n"  // dr * a
258788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d20, q10, #8                  \n"  // db >>= 8
258888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d21, q11, #8                  \n"  // dg >>= 8
258988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d22, q12, #8                  \n"  // dr >>= 8
259088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqsub.u8   q2, q2, q10                    \n"  // dbg - dbg * a / 256
259188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqsub.u8   d6, d6, d22                    \n"  // dr - dr * a / 256
259288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   q0, q0, q2                     \n"  // + sbg
259388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d2, d2, d6                     \n"  // + sr
259488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, #255                       \n"  // a = 255
259541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
259688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%2]!        \n"  // store 8 pixels of ARGB.
259788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bge        8b                             \n"
259888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
259988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "89:                                         \n"
260088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "adds       %3, #8-1                       \n"
260188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "blt        99f                            \n"
260288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
260388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Blend 1 pixels.
260488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
260541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
260688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0[0],d1[0],d2[0],d3[0]}, [%0]! \n"  // load 1 pixel ARGB0.
260741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
260888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d4[0],d5[0],d6[0],d7[0]}, [%1]! \n"  // load 1 pixel ARGB1.
260988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #1                     \n"  // 1 processed per loop.
261088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q10, d4, d3                    \n"  // db * a
261188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q11, d5, d3                    \n"  // dg * a
261288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q12, d6, d3                    \n"  // dr * a
261388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d20, q10, #8                  \n"  // db >>= 8
261488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d21, q11, #8                  \n"  // dg >>= 8
261588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d22, q12, #8                  \n"  // dr >>= 8
261688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqsub.u8   q2, q2, q10                    \n"  // dbg - dbg * a / 256
261788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqsub.u8   d6, d6, d22                    \n"  // dr - dr * a / 256
261888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   q0, q0, q2                     \n"  // + sbg
261988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d2, d2, d6                     \n"  // + sr
262088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, #255                       \n"  // a = 255
262141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
262288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0[0],d1[0],d2[0],d3[0]}, [%2]! \n"  // store 1 pixel.
262388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bge        1b                             \n"
262488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
262588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "99:                                         \n"
262688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
262788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb0),    // %0
262888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_argb1),    // %1
262988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),     // %2
263088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)         // %3
263188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
263288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q10", "q11", "q12"
263388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
263488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
263588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
263688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Attenuate 8 pixels at a time.
263788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBAttenuateRow_NEON(const uint8* src_argb, uint8* dst_argb, int width) {
263888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
263988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // Attenuate 8 pixels.
264088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
264141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
264288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 pixels of ARGB.
264388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
264488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q10, d0, d3                    \n"  // b * a
264588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q11, d1, d3                    \n"  // g * a
264688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q12, d2, d3                    \n"  // r * a
264788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d0, q10, #8                   \n"  // b >>= 8
264888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d1, q11, #8                   \n"  // g >>= 8
264988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrn.u16 d2, q12, #8                   \n"  // r >>= 8
265041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
265188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%1]!        \n"  // store 8 pixels of ARGB.
265288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
265388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),   // %0
265488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),   // %1
265588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)       // %2
265688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
265788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q10", "q11", "q12"
265888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
265988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
266088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
266188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Quantize 8 ARGB pixels (32 bytes).
266288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// dst = (dst * scale >> 16) * interval_size + interval_offset;
266388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBQuantizeRow_NEON(uint8* dst_argb, int scale, int interval_size,
266488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          int interval_offset, int width) {
266588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
266688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vdup.u16   q8, %2                         \n"
266788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u16   q8, q8, #1                     \n"  // scale >>= 1
266888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vdup.u16   q9, %3                         \n"  // interval multiply.
266988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vdup.u16   q10, %4                        \n"  // interval add
267088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
267188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 8 pixel loop.
267288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
267388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
267441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
267588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]         \n"  // load 8 pixels of ARGB.
267688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %1, %1, #8                     \n"  // 8 processed per loop.
267788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q0, d0                         \n"  // b (0 .. 255)
267888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q1, d2                         \n"
267988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q2, d4                         \n"
268088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqdmulh.s16 q0, q0, q8                    \n"  // b * scale
268188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqdmulh.s16 q1, q1, q8                    \n"  // g
268288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqdmulh.s16 q2, q2, q8                    \n"  // r
268388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.u16   q0, q0, q9                     \n"  // b * interval_size
268488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.u16   q1, q1, q9                     \n"  // g
268588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.u16   q2, q2, q9                     \n"  // r
268688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q0, q0, q10                    \n"  // b + interval_offset
268788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q1, q1, q10                    \n"  // g
268888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.u16   q2, q2, q10                    \n"  // r
268988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d0, q0                         \n"
269088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d2, q1                         \n"
269188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d4, q2                         \n"
269241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
269388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d2, d4, d6}, [%0]!        \n"  // store 8 pixels of ARGB.
269488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
269588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(dst_argb),       // %0
269688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)           // %1
269788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "r"(scale),           // %2
269888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "r"(interval_size),   // %3
269988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "r"(interval_offset)  // %4
270088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q8", "q9", "q10"
270188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
270288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
270388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
270488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Shade 8 pixels at a time by specified value.
270588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// NOTE vqrdmulh.s16 q10, q10, d0[0] must use a scaler register from 0 to 8.
270688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Rounding in vqrdmulh does +1 to high if high bit of low s16 is set.
270788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBShadeRow_NEON(const uint8* src_argb, uint8* dst_argb, int width,
270888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                       uint32 value) {
270988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
271088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vdup.u32   q0, %3                         \n"  // duplicate scale value.
271188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vzip.u8    d0, d1                         \n"  // d0 aarrggbb.
271288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vshr.u16   q0, q0, #1                     \n"  // scale / 2.
271388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
271488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 8 pixel loop.
271588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
271688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
271741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
271888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d20, d22, d24, d26}, [%0]!    \n"  // load 8 pixels of ARGB.
271988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
272088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q10, d20                       \n"  // b (0 .. 255)
272188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q11, d22                       \n"
272288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q12, d24                       \n"
272388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q13, d26                       \n"
272488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrdmulh.s16 q10, q10, d0[0]              \n"  // b * scale * 2
272588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrdmulh.s16 q11, q11, d0[1]              \n"  // g
272688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrdmulh.s16 q12, q12, d0[2]              \n"  // r
272788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrdmulh.s16 q13, q13, d0[3]              \n"  // a
272888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d20, q10                       \n"
272988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d22, q11                       \n"
273088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d24, q12                       \n"
273188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d26, q13                       \n"
273241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
273388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d20, d22, d24, d26}, [%1]!    \n"  // store 8 pixels of ARGB.
273488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
273588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),       // %0
273688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),       // %1
273788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)           // %2
273888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "r"(value)            // %3
273988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q10", "q11", "q12", "q13"
274088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
274188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
274288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
274388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 8 ARGB pixels (64 bytes) to 8 Gray ARGB pixels
274488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Similar to ARGBToYJ but stores ARGB.
274588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// C code is (15 * b + 75 * g + 38 * r + 64) >> 7;
274688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBGrayRow_NEON(const uint8* src_argb, uint8* dst_argb, int width) {
274788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
274888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d24, #15                       \n"  // B * 0.11400 coefficient
274988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d25, #75                       \n"  // G * 0.58700 coefficient
275088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #38                       \n"  // R * 0.29900 coefficient
275188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
275288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
275341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
275488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 ARGB pixels.
275588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
275688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d0, d24                    \n"  // B
275788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d1, d25                    \n"  // G
275888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d2, d26                    \n"  // R
275988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqrshrun.s16 d0, q2, #7                   \n"  // 15 bit to 8 bit B
276088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov       d1, d0                         \n"  // G
276188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov       d2, d0                         \n"  // R
276241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
276388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%1]!        \n"  // store 8 ARGB pixels.
276488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
276588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),  // %0
276688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),  // %1
276788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)      // %2
276888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
276988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q12", "q13"
277088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
277188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
277288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
277388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Convert 8 ARGB pixels (32 bytes) to 8 Sepia ARGB pixels.
277488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    b = (r * 35 + g * 68 + b * 17) >> 7
277588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    g = (r * 45 + g * 88 + b * 22) >> 7
277688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//    r = (r * 50 + g * 98 + b * 24) >> 7
277788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBSepiaRow_NEON(uint8* dst_argb, int width) {
277888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
277988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d20, #17                       \n"  // BB coefficient
278088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d21, #68                       \n"  // BG coefficient
278188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d22, #35                       \n"  // BR coefficient
278288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d24, #22                       \n"  // GB coefficient
278388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d25, #88                       \n"  // GG coefficient
278488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d26, #45                       \n"  // GR coefficient
278588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d28, #24                       \n"  // BB coefficient
278688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d29, #98                       \n"  // BG coefficient
278788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d30, #50                       \n"  // BR coefficient
278888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
278988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
279041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
279188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]         \n"  // load 8 ARGB pixels.
279288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %1, %1, #8                     \n"  // 8 processed per loop.
279388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d0, d20                    \n"  // B to Sepia B
279488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d1, d21                    \n"  // G
279588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q2, d2, d22                    \n"  // R
279688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q3, d0, d24                    \n"  // B to Sepia G
279788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q3, d1, d25                    \n"  // G
279888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q3, d2, d26                    \n"  // R
279988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q8, d0, d28                    \n"  // B to Sepia R
280088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d1, d29                    \n"  // G
280188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmlal.u8   q8, d2, d30                    \n"  // R
280288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16 d0, q2, #7                     \n"  // 16 bit to 8 bit B
280388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16 d1, q3, #7                     \n"  // 16 bit to 8 bit G
280488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrn.u16 d2, q8, #7                     \n"  // 16 bit to 8 bit R
280541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
280688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%0]!        \n"  // store 8 ARGB pixels.
280788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
280888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(dst_argb),  // %0
280988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)      // %1
281088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
281188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3",
281288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q10", "q11", "q12", "q13", "q14", "q15"
281388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
281488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
281588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
281688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Tranform 8 ARGB pixels (32 bytes) with color matrix.
281788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): Was same as Sepia except matrix is provided.  This function
281888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// needs to saturate.  Consider doing a non-saturating version.
281988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBColorMatrixRow_NEON(const uint8* src_argb, uint8* dst_argb,
282088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                             const int8* matrix_argb, int width) {
282188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
282241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
282388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q2}, [%3]                     \n"  // load 3 ARGB vectors.
282488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.s8   q0, d4                         \n"  // B,G coefficients s16.
282588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.s8   q1, d5                         \n"  // R,A coefficients s16.
282688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
282788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
282888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
282941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
283088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d16, d18, d20, d22}, [%0]!    \n"  // load 8 ARGB pixels.
283188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %2, %2, #8                     \n"  // 8 processed per loop.
283288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q8, d16                        \n"  // b (0 .. 255) 16 bit
283388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q9, d18                        \n"  // g
283488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q10, d20                       \n"  // r
283588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmovl.u8   q15, d22                       \n"  // a
283688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q12, q8, d0[0]                 \n"  // B = B * Matrix B
283788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q13, q8, d1[0]                 \n"  // G = B * Matrix G
283888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q14, q8, d2[0]                 \n"  // R = B * Matrix R
283988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q15, q8, d3[0]                 \n"  // A = B * Matrix A
284088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q4, q9, d0[1]                  \n"  // B += G * Matrix B
284188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q5, q9, d1[1]                  \n"  // G += G * Matrix G
284288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q6, q9, d2[1]                  \n"  // R += G * Matrix R
284388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q7, q9, d3[1]                  \n"  // A += G * Matrix A
284488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q12, q12, q4                   \n"  // Accumulate B
284588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q13, q13, q5                   \n"  // Accumulate G
284688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q14, q14, q6                   \n"  // Accumulate R
284788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q15, q15, q7                   \n"  // Accumulate A
284888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q4, q10, d0[2]                 \n"  // B += R * Matrix B
284988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q5, q10, d1[2]                 \n"  // G += R * Matrix G
285088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q6, q10, d2[2]                 \n"  // R += R * Matrix R
285188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q7, q10, d3[2]                 \n"  // A += R * Matrix A
285288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q12, q12, q4                   \n"  // Accumulate B
285388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q13, q13, q5                   \n"  // Accumulate G
285488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q14, q14, q6                   \n"  // Accumulate R
285588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q15, q15, q7                   \n"  // Accumulate A
285688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q4, q15, d0[3]                 \n"  // B += A * Matrix B
285788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q5, q15, d1[3]                 \n"  // G += A * Matrix G
285888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q6, q15, d2[3]                 \n"  // R += A * Matrix R
285988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmul.s16   q7, q15, d3[3]                 \n"  // A += A * Matrix A
286088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q12, q12, q4                   \n"  // Accumulate B
286188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q13, q13, q5                   \n"  // Accumulate G
286288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q14, q14, q6                   \n"  // Accumulate R
286388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.s16  q15, q15, q7                   \n"  // Accumulate A
286488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrun.s16 d16, q12, #6                  \n"  // 16 bit to 8 bit B
286588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrun.s16 d18, q13, #6                  \n"  // 16 bit to 8 bit G
286688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrun.s16 d20, q14, #6                  \n"  // 16 bit to 8 bit R
286788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqshrun.s16 d22, q15, #6                  \n"  // 16 bit to 8 bit A
286841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
286988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d16, d18, d20, d22}, [%1]!    \n"  // store 8 ARGB pixels.
287088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
287188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb),   // %0
287288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),   // %1
287388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)       // %2
287488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "r"(matrix_argb)  // %3
287588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9",
287688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "q10", "q11", "q12", "q13", "q14", "q15"
287788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
287888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
287988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
288088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// TODO(fbarchard): fix vqshrun in ARGBMultiplyRow_NEON and reenable.
288188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef HAS_ARGBMULTIPLYROW_NEON
288288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Multiply 2 rows of ARGB pixels together, 8 pixels at a time.
288388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBMultiplyRow_NEON(const uint8* src_argb0, const uint8* src_argb1,
288488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_argb, int width) {
288588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
288688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 8 pixel loop.
288788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
288888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
288941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
289088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d2, d4, d6}, [%0]!        \n"  // load 8 ARGB pixels.
289141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
289288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d1, d3, d5, d7}, [%1]!        \n"  // load 8 more ARGB pixels.
289388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"  // 8 processed per loop.
289488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q0, d0, d1                     \n"  // multiply B
289588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q1, d2, d3                     \n"  // multiply G
289688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q2, d4, d5                     \n"  // multiply R
289788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmull.u8   q3, d6, d7                     \n"  // multiply A
289888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshrn.u16 d0, q0, #8                     \n"  // 16 bit to 8 bit B
289988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshrn.u16 d1, q1, #8                     \n"  // 16 bit to 8 bit G
290088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshrn.u16 d2, q2, #8                     \n"  // 16 bit to 8 bit R
290188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vrshrn.u16 d3, q3, #8                     \n"  // 16 bit to 8 bit A
290241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
290388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%2]!        \n"  // store 8 ARGB pixels.
290488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
290588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
290688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb0),  // %0
290788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_argb1),  // %1
290888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),   // %2
290988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)       // %3
291088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
291188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3"
291288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
291388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
291488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // HAS_ARGBMULTIPLYROW_NEON
291588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
291688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Add 2 rows of ARGB pixels together, 8 pixels at a time.
291788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBAddRow_NEON(const uint8* src_argb0, const uint8* src_argb1,
291888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_argb, int width) {
291988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
292088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 8 pixel loop.
292188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
292288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
292341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
292488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 ARGB pixels.
292541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
292688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d4, d5, d6, d7}, [%1]!        \n"  // load 8 more ARGB pixels.
292788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"  // 8 processed per loop.
292888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   q0, q0, q2                     \n"  // add B, G
292988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   q1, q1, q3                     \n"  // add R, A
293041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
293188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%2]!        \n"  // store 8 ARGB pixels.
293288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
293388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
293488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb0),  // %0
293588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_argb1),  // %1
293688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),   // %2
293788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)       // %3
293888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
293988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3"
294088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
294188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
294288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
294388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Subtract 2 rows of ARGB pixels, 8 pixels at a time.
294488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid ARGBSubtractRow_NEON(const uint8* src_argb0, const uint8* src_argb1,
294588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_argb, int width) {
294688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
294788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 8 pixel loop.
294888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
294988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
295041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
295188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d0, d1, d2, d3}, [%0]!        \n"  // load 8 ARGB pixels.
295241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
295388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld4.8     {d4, d5, d6, d7}, [%1]!        \n"  // load 8 more ARGB pixels.
295488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"  // 8 processed per loop.
295588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqsub.u8   q0, q0, q2                     \n"  // subtract B, G
295688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqsub.u8   q1, q1, q3                     \n"  // subtract R, A
295741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
295888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%2]!        \n"  // store 8 ARGB pixels.
295988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
296088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
296188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_argb0),  // %0
296288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_argb1),  // %1
296388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),   // %2
296488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)       // %3
296588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
296688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1", "q2", "q3"
296788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
296888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
296988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
297088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Adds Sobel X and Sobel Y and stores Sobel into ARGB.
297188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// A = 255
297288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// R = Sobel
297388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// G = Sobel
297488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// B = Sobel
297588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelRow_NEON(const uint8* src_sobelx, const uint8* src_sobely,
297688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_argb, int width) {
297788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
297888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, #255                       \n"  // alpha
297988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 8 pixel loop.
298088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
298188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
298241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
298388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0]!                    \n"  // load 8 sobelx.
298441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
298588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d1}, [%1]!                    \n"  // load 8 sobely.
298688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"  // 8 processed per loop.
298788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d0, d0, d1                     \n"  // add
298888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d1, d0                         \n"
298988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d2, d0                         \n"
299041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
299188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%2]!        \n"  // store 8 ARGB pixels.
299288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
299388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_sobelx),  // %0
299488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_sobely),  // %1
299588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),    // %2
299688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)        // %3
299788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
299888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"
299988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
300088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
300188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
300288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Adds Sobel X and Sobel Y and stores Sobel into plane.
300388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelToPlaneRow_NEON(const uint8* src_sobelx, const uint8* src_sobely,
300488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                          uint8* dst_y, int width) {
300588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
300688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 16 pixel loop.
300788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
300888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
300941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
301088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q0}, [%0]!                    \n"  // load 16 sobelx.
301141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
301288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {q1}, [%1]!                    \n"  // load 16 sobely.
301388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #16                    \n"  // 16 processed per loop.
301488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   q0, q0, q1                     \n"  // add
301541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
301688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {q0}, [%2]!                    \n"  // store 16 pixels.
301788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
301888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_sobelx),  // %0
301988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_sobely),  // %1
302088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_y),       // %2
302188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)        // %3
302288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
302388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"
302488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
302588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
302688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
302788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// Mixes Sobel X, Sobel Y and Sobel into ARGB.
302888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// A = 255
302988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// R = Sobel X
303088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// G = Sobel
303188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// B = Sobel Y
303288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelXYRow_NEON(const uint8* src_sobelx, const uint8* src_sobely,
303388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                     uint8* dst_argb, int width) {
303488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
303588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vmov.u8    d3, #255                       \n"  // alpha
303688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    // 8 pixel loop.
303788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
303888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
303941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
304088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%0]!                    \n"  // load 8 sobelx.
304141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
304288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%1]!                    \n"  // load 8 sobely.
304388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"  // 8 processed per loop.
304488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqadd.u8   d1, d0, d2                     \n"  // add
304541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
304688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst4.8     {d0, d1, d2, d3}, [%2]!        \n"  // store 8 ARGB pixels.
304788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
304888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_sobelx),  // %0
304988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_sobely),  // %1
305088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_argb),    // %2
305188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)        // %3
305288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  :
305388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"
305488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
305588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
305688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
305788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SobelX as a matrix is
305888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// -1  0  1
305988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// -2  0  2
306088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// -1  0  1
306188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelXRow_NEON(const uint8* src_y0, const uint8* src_y1,
306288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                    const uint8* src_y2, uint8* dst_sobelx, int width) {
306388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
306488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
306588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
306641294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
306788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0],%5                  \n"  // top
306841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
306988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d1}, [%0],%6                  \n"
307088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vsubl.u8   q0, d0, d1                     \n"
307141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
307288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%1],%5                  \n"  // center * 2
307341294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
307488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d3}, [%1],%6                  \n"
307588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vsubl.u8   q1, d2, d3                     \n"
307688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.s16   q0, q0, q1                     \n"
307788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.s16   q0, q0, q1                     \n"
307841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
307988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%2],%5                  \n"  // bottom
308041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
308188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d3}, [%2],%6                  \n"
308288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %4, %4, #8                     \n"  // 8 pixels
308388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vsubl.u8   q1, d2, d3                     \n"
308488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.s16   q0, q0, q1                     \n"
308588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vabs.s16   q0, q0                         \n"
308688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d0, q0                         \n"
308741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(3)
308888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%3]!                    \n"  // store 8 sobelx
308988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
309088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_y0),      // %0
309188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_y1),      // %1
309288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_y2),      // %2
309388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_sobelx),  // %3
309488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)        // %4
309588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "r"(2),            // %5
309688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "r"(6)             // %6
309788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"  // Clobber List
309888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
309988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
310088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
310188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// SobelY as a matrix is
310288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org// -1 -2 -1
310388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//  0  0  0
310488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org//  1  2  1
310588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.orgvoid SobelYRow_NEON(const uint8* src_y0, const uint8* src_y1,
310688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org                    uint8* dst_sobely, int width) {
310788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  asm volatile (
310888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    ".p2align   2                              \n"
310988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  "1:                                          \n"
311041294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
311188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d0}, [%0],%4                  \n"  // left
311241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
311388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d1}, [%1],%4                  \n"
311488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vsubl.u8   q0, d0, d1                     \n"
311541294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
311688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%0],%4                  \n"  // center * 2
311741294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
311888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d3}, [%1],%4                  \n"
311988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vsubl.u8   q1, d2, d3                     \n"
312088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.s16   q0, q0, q1                     \n"
312188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.s16   q0, q0, q1                     \n"
312241294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(0)
312388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d2}, [%0],%5                  \n"  // right
312441294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(1)
312588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vld1.8     {d3}, [%1],%5                  \n"
312688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "subs       %3, %3, #8                     \n"  // 8 pixels
312788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vsubl.u8   q1, d2, d3                     \n"
312888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vadd.s16   q0, q0, q1                     \n"
312988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vabs.s16   q0, q0                         \n"
313088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vqmovn.u16 d0, q0                         \n"
313141294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org    MEMACCESS(2)
313288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "vst1.8     {d0}, [%2]!                    \n"  // store 8 sobely
313388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "bgt        1b                             \n"
313488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "+r"(src_y0),      // %0
313588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(src_y1),      // %1
313688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(dst_sobely),  // %2
313788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "+r"(width)        // %3
313888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "r"(1),            // %4
313988b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org    "r"(6)             // %5
314088b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  : "cc", "memory", "q0", "q1"  // Clobber List
314188b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org  );
314288b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}
314388b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif  // __ARM_NEON__
314488b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org
314588b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#ifdef __cplusplus
314688b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}  // extern "C"
314788b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org}  // namespace libyuv
314888b47b29cc274dd19cddc37c1ce1834d97df282efgalligan@chromium.org#endif
3149