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