diff options
author | ashok.bhat@gmail.com <ashok.bhat@gmail.com> | 2014-09-29 18:10:20 +0000 |
---|---|---|
committer | ashok.bhat@gmail.com <ashok.bhat@gmail.com> | 2014-09-29 18:10:20 +0000 |
commit | c379d17195c31e0b32d0f61741adf8258305cc8b (patch) | |
tree | 1277b9249b9be0b06e9cf45eda0c7858686601fd | |
parent | 824d9071d7577c649d9e30fa9b2fe71a8becbe4a (diff) | |
download | libyuv-c379d17195c31e0b32d0f61741adf8258305cc8b.tar.gz |
Row AArch64 Neon implementation - Part 11
BUG=319
TESTED=libyuv_unittest
R=fbarchard@google.com
Change-Id: Id187c5cbdbbb5570598eb9fcd9c3d6699e175f03
Signed-off-by: Ashok Bhat <ashok.bhat@arm.com>
Review URL: https://webrtc-codereview.appspot.com/24759004
git-svn-id: http://libyuv.googlecode.com/svn/trunk@1096 16f28f9a-4ce2-e073-06de-1de4eb20be90
-rw-r--r-- | README.chromium | 2 | ||||
-rw-r--r-- | include/libyuv/row.h | 28 | ||||
-rw-r--r-- | include/libyuv/version.h | 2 | ||||
-rw-r--r-- | source/row_common.cc | 2 | ||||
-rw-r--r-- | source/row_neon64.cc | 435 |
5 files changed, 187 insertions, 282 deletions
diff --git a/README.chromium b/README.chromium index 528babe..895e95a 100644 --- a/README.chromium +++ b/README.chromium @@ -1,6 +1,6 @@ Name: libyuv URL: http://code.google.com/p/libyuv/ -Version: 1095 +Version: 1096 License: BSD License File: LICENSE diff --git a/include/libyuv/row.h b/include/libyuv/row.h index 72950c3..05a7888 100644 --- a/include/libyuv/row.h +++ b/include/libyuv/row.h @@ -259,25 +259,25 @@ extern "C" { // The following are available on arm64 platforms: #if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__) -// #define HAS_I444TOARGBROW_NEON -// #define HAS_I422TOARGBROW_NEON -// #define HAS_I411TOARGBROW_NEON -// #define HAS_I422TOBGRAROW_NEON -// #define HAS_I422TOABGRROW_NEON -// #define HAS_I422TORGBAROW_NEON -// #define HAS_I422TORGB24ROW_NEON -// #define HAS_I422TORAWROW_NEON +#define HAS_I444TOARGBROW_NEON +#define HAS_I422TOARGBROW_NEON +#define HAS_I411TOARGBROW_NEON +#define HAS_I422TOBGRAROW_NEON +#define HAS_I422TOABGRROW_NEON +#define HAS_I422TORGBAROW_NEON +#define HAS_I422TORGB24ROW_NEON +#define HAS_I422TORAWROW_NEON // #define HAS_I422TORGB565ROW_NEON // #define HAS_I422TOARGB1555ROW_NEON // #define HAS_I422TOARGB4444ROW_NEON -// #define HAS_YTOARGBROW_NEON -// #define HAS_I400TOARGBROW_NEON -// #define HAS_NV12TOARGBROW_NEON -// #define HAS_NV21TOARGBROW_NEON +#define HAS_YTOARGBROW_NEON +#define HAS_I400TOARGBROW_NEON +#define HAS_NV12TOARGBROW_NEON +#define HAS_NV21TOARGBROW_NEON // #define HAS_NV12TORGB565ROW_NEON // #define HAS_NV21TORGB565ROW_NEON -// #define HAS_YUY2TOARGBROW_NEON -// #define HAS_UYVYTOARGBROW_NEON +#define HAS_YUY2TOARGBROW_NEON +#define HAS_UYVYTOARGBROW_NEON #define HAS_SPLITUVROW_NEON #define HAS_MERGEUVROW_NEON #define HAS_COPYROW_NEON diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 8ad4924..ab370ff 100644 --- a/include/libyuv/version.h +++ b/include/libyuv/version.h @@ -11,6 +11,6 @@ #ifndef INCLUDE_LIBYUV_VERSION_H_ // NOLINT #define INCLUDE_LIBYUV_VERSION_H_ -#define LIBYUV_VERSION 1095 +#define LIBYUV_VERSION 1096 #endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT diff --git a/source/row_common.cc b/source/row_common.cc index fa2b752..b998819 100644 --- a/source/row_common.cc +++ b/source/row_common.cc @@ -964,7 +964,7 @@ static __inline void YuvPixel(uint8 y, uint8 u, uint8 v, } #if !defined(LIBYUV_DISABLE_NEON) && \ - (defined(__ARM_NEON__) || defined(LIBYUV_NEON)) + (defined(__ARM_NEON__) || defined(__aarch64__) || defined(LIBYUV_NEON)) // C mimic assembly. // TODO(fbarchard): Remove subsampling from Neon. void I444ToARGBRow_C(const uint8* src_y, diff --git a/source/row_neon64.cc b/source/row_neon64.cc index cbb2344..164786d 100644 --- a/source/row_neon64.cc +++ b/source/row_neon64.cc @@ -21,107 +21,106 @@ extern "C" { // Read 8 Y, 4 U and 4 V from 422 #define READYUV422 \ MEMACCESS(0) \ - "vld1.8 {d0}, [%0]! \n" \ + "ld1 {v0.8b}, [%0], #8 \n" \ MEMACCESS(1) \ - "vld1.32 {d2[0]}, [%1]! \n" \ + "ld1 {v1.s}[0], [%1], #4 \n" \ MEMACCESS(2) \ - "vld1.32 {d2[1]}, [%2]! \n" + "ld1 {v1.s}[1], [%2], #4 \n" // Read 8 Y, 2 U and 2 V from 422 #define READYUV411 \ MEMACCESS(0) \ - "vld1.8 {d0}, [%0]! \n" \ + "ld1 {v0.8b}, [%0], #8 \n" \ MEMACCESS(1) \ - "vld1.16 {d2[0]}, [%1]! \n" \ + "ld1 {v2.h}[0], [%1], #2 \n" \ MEMACCESS(2) \ - "vld1.16 {d2[1]}, [%2]! \n" \ - "vmov.u8 d3, d2 \n" \ - "vzip.u8 d2, d3 \n" + "ld1 {v2.h}[1], [%2], #2 \n" \ + "zip1 v1.8b, v2.8b, v2.8b \n" // Read 8 Y, 8 U and 8 V from 444 #define READYUV444 \ MEMACCESS(0) \ - "vld1.8 {d0}, [%0]! \n" \ + "ld1 {v0.8b}, [%0], #8 \n" \ MEMACCESS(1) \ - "vld1.8 {d2}, [%1]! \n" \ + "ld1 {v1.d}[0], [%1], #8 \n" \ MEMACCESS(2) \ - "vld1.8 {d3}, [%2]! \n" \ - "vpaddl.u8 q1, q1 \n" \ - "vrshrn.u16 d2, q1, #1 \n" + "ld1 {v1.d}[1], [%2], #8 \n" \ + "uaddlp v1.8h, v1.16b \n" \ + "rshrn v1.8b, v1.8h, #1 \n" // Read 8 Y, and set 4 U and 4 V to 128 #define READYUV400 \ MEMACCESS(0) \ - "vld1.8 {d0}, [%0]! \n" \ - "vmov.u8 d2, #128 \n" + "ld1 {v0.8b}, [%0], #8 \n" \ + "movi v1.8b , #128 \n" // Read 8 Y and 4 UV from NV12 #define READNV12 \ MEMACCESS(0) \ - "vld1.8 {d0}, [%0]! \n" \ + "ld1 {v0.8b}, [%0], #8 \n" \ MEMACCESS(1) \ - "vld1.8 {d2}, [%1]! \n" \ - "vmov.u8 d3, d2 \n"/* split odd/even uv apart */\ - "vuzp.u8 d2, d3 \n" \ - "vtrn.u32 d2, d3 \n" + "ld1 {v2.8b}, [%1], #8 \n" \ + "uzp1 v1.8b, v2.8b, v2.8b \n" \ + "uzp2 v3.8b, v2.8b, v2.8b \n" \ + "ins v1.s[1], v3.s[0] \n" // Read 8 Y and 4 VU from NV21 #define READNV21 \ MEMACCESS(0) \ - "vld1.8 {d0}, [%0]! \n" \ + "ld1 {v0.8b}, [%0], #8 \n" \ MEMACCESS(1) \ - "vld1.8 {d2}, [%1]! \n" \ - "vmov.u8 d3, d2 \n"/* split odd/even uv apart */\ - "vuzp.u8 d3, d2 \n" \ - "vtrn.u32 d2, d3 \n" + "ld1 {v2.8b}, [%1], #8 \n" \ + "uzp1 v3.8b, v2.8b, v2.8b \n" \ + "uzp2 v1.8b, v2.8b, v2.8b \n" \ + "ins v1.s[1], v3.s[0] \n" // Read 8 YUY2 #define READYUY2 \ MEMACCESS(0) \ - "vld2.8 {d0, d2}, [%0]! \n" \ - "vmov.u8 d3, d2 \n" \ - "vuzp.u8 d2, d3 \n" \ - "vtrn.u32 d2, d3 \n" + "ld2 {v0.8b, v1.8b}, [%0], #16 \n" \ + "uzp2 v3.8b, v1.8b, v1.8b \n" \ + "uzp1 v1.8b, v1.8b, v1.8b \n" \ + "ins v1.s[1], v3.s[0] \n" // Read 8 UYVY #define READUYVY \ MEMACCESS(0) \ - "vld2.8 {d2, d3}, [%0]! \n" \ - "vmov.u8 d0, d3 \n" \ - "vmov.u8 d3, d2 \n" \ - "vuzp.u8 d2, d3 \n" \ - "vtrn.u32 d2, d3 \n" - -#define YUV422TORGB \ - "veor.u8 d2, d26 \n"/*subtract 128 from u and v*/\ - "vmull.s8 q8, d2, d24 \n"/* u/v B/R component */\ - "vmull.s8 q9, d2, d25 \n"/* u/v G component */\ - "vmov.u8 d1, #0 \n"/* split odd/even y apart */\ - "vtrn.u8 d0, d1 \n" \ - "vsub.s16 q0, q0, q15 \n"/* offset y */\ - "vmul.s16 q0, q0, q14 \n" \ - "vadd.s16 d18, d19 \n" \ - "vqadd.s16 d20, d0, d16 \n" /* B */ \ - "vqadd.s16 d21, d1, d16 \n" \ - "vqadd.s16 d22, d0, d17 \n" /* R */ \ - "vqadd.s16 d23, d1, d17 \n" \ - "vqadd.s16 d16, d0, d18 \n" /* G */ \ - "vqadd.s16 d17, d1, d18 \n" \ - "vqshrun.s16 d0, q10, #6 \n" /* B */ \ - "vqshrun.s16 d1, q11, #6 \n" /* G */ \ - "vqshrun.s16 d2, q8, #6 \n" /* R */ \ - "vmovl.u8 q10, d0 \n"/* set up for reinterleave*/\ - "vmovl.u8 q11, d1 \n" \ - "vmovl.u8 q8, d2 \n" \ - "vtrn.u8 d20, d21 \n" \ - "vtrn.u8 d22, d23 \n" \ - "vtrn.u8 d16, d17 \n" \ - "vmov.u8 d21, d16 \n" - -static vec8 kUVToRB = { 127, 127, 127, 127, 102, 102, 102, 102, - 0, 0, 0, 0, 0, 0, 0, 0 }; -static vec8 kUVToG = { -25, -25, -25, -25, -52, -52, -52, -52, - 0, 0, 0, 0, 0, 0, 0, 0 }; + "ld2 {v2.8b, v3.8b}, [%0], #16 \n" \ + "mov v0.8b, v3.8b \n" \ + "uzp1 v1.8b, v2.8b, v2.8b \n" \ + "uzp2 v3.8b, v2.8b, v2.8b \n" \ + "ins v1.s[1], v3.s[0] \n" + +#define YUV422TORGB_SETUP_REG \ + "movi v24.8b, #128 \n" \ + "movi v25.8h, #74 \n" /* YG */\ + "movi v26.8h, #16 \n" \ + "movi v27.8h, #127 \n" /* UB */\ + "movi v28.8h, #102 \n" /* VR */\ + "mvni v29.8h, #0x18 \n" /* UG -25 */\ + "mvni v30.8h, #0x33 \n" /* VG -52 */ + +#define YUV422TORGB(vR, vG, vB) \ + "eor v1.8b, v1.8b, v24.8b \n" /* Subtract 128 from U&V */ \ + "uxtl v0.8h, v0.8b \n" /* Extract Y */ \ + "shll v2.8h, v1.8b, #8 \n" /* Replicate UV */ \ + "sub v0.8h, v0.8h, v26.8h \n" /* offset y */ \ + "uaddw v1.8h, v2.8h, v1.8b \n" \ + "mul v0.8h, v0.8h, v25.8h \n" /* Y x 74 */ \ + "mov v2.d[0], v1.d[1] \n" /* Extract V */ \ + "sxtl v2.8h, v2.8b \n" \ + "sxtl v1.8h, v1.8b \n" /* Extract U */ \ + "mul " #vR ".8h, v2.8h, v28.8h \n" /* R = (V - 128) x VR */ \ + "mul " #vB ".8h, v1.8h, v27.8h \n" /* B = (U - 128) x UB */ \ + "mul " #vG ".8h, v1.8h, v29.8h \n" /* G1 = (U - 128) x UG */ \ + "mul v2.8h, v2.8h, v30.8h \n" /* G2 = (V - 128) x VG */ \ + "sqadd " #vR ".8h, " #vR ".8h, v0.8h \n" /* R += (Y - 16) YG */ \ + "sqadd " #vB ".8h, " #vB ".8h, v0.8h \n" /* B += (Y - 16) YG */ \ + "sqadd " #vG ".8h, " #vG ".8h, v2.8h \n" /* G = G1 + G2 */ \ + "sqadd " #vG ".8h, " #vG ".8h, v0.8h \n" /* G += (Y - 16) YG */ \ + "sqshrun " #vR ".8b, " #vR ".8h, #6 \n" /* R */ \ + "sqshrun " #vB ".8b, " #vB ".8h, #6 \n" /* B */ \ + "sqshrun " #vG ".8b, " #vG ".8h, #6 \n" /* G */ #ifdef HAS_I444TOARGBROW_NEON void I444ToARGBRow_NEON(const uint8* src_y, @@ -130,31 +129,24 @@ void I444ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width) { asm volatile ( - MEMACCESS(5) - "vld1.8 {d24}, [%5] \n" - MEMACCESS(6) - "vld1.8 {d25}, [%6] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV444 - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %4, %4, #8 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" /* A */ MEMACCESS(3) - "vst4.8 {d20, d21, d22, d23}, [%3]! \n" + "st4 {v20.8b-v23.8b}, [%3], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(src_u), // %1 "+r"(src_v), // %2 "+r"(dst_argb), // %3 "+r"(width) // %4 - : "r"(&kUVToRB), // %5 - "r"(&kUVToG) // %6 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_I444TOARGBROW_NEON @@ -166,31 +158,24 @@ void I422ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width) { asm volatile ( - MEMACCESS(5) - "vld1.8 {d24}, [%5] \n" - MEMACCESS(6) - "vld1.8 {d25}, [%6] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV422 - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %4, %4, #8 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" /* A */ MEMACCESS(3) - "vst4.8 {d20, d21, d22, d23}, [%3]! \n" + "st4 {v20.8b-v23.8b}, [%3], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(src_u), // %1 "+r"(src_v), // %2 "+r"(dst_argb), // %3 "+r"(width) // %4 - : "r"(&kUVToRB), // %5 - "r"(&kUVToG) // %6 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_I422TOARGBROW_NEON @@ -202,31 +187,24 @@ void I411ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width) { asm volatile ( - MEMACCESS(5) - "vld1.8 {d24}, [%5] \n" - MEMACCESS(6) - "vld1.8 {d25}, [%6] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV411 - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %4, %4, #8 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" /* A */ MEMACCESS(3) - "vst4.8 {d20, d21, d22, d23}, [%3]! \n" + "st4 {v20.8b-v23.8b}, [%3], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(src_u), // %1 "+r"(src_v), // %2 "+r"(dst_argb), // %3 "+r"(width) // %4 - : "r"(&kUVToRB), // %5 - "r"(&kUVToG) // %6 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_I411TOARGBROW_NEON @@ -238,32 +216,24 @@ void I422ToBGRARow_NEON(const uint8* src_y, uint8* dst_bgra, int width) { asm volatile ( - MEMACCESS(5) - "vld1.8 {d24}, [%5] \n" - MEMACCESS(6) - "vld1.8 {d25}, [%6] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV422 - YUV422TORGB + YUV422TORGB(v21, v22, v23) "subs %4, %4, #8 \n" - "vswp.u8 d20, d22 \n" - "vmov.u8 d19, #255 \n" + "movi v20.8b, #255 \n" /* A */ MEMACCESS(3) - "vst4.8 {d19, d20, d21, d22}, [%3]! \n" + "st4 {v20.8b-v23.8b}, [%3], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(src_u), // %1 "+r"(src_v), // %2 "+r"(dst_bgra), // %3 "+r"(width) // %4 - : "r"(&kUVToRB), // %5 - "r"(&kUVToG) // %6 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_I422TOBGRAROW_NEON @@ -275,32 +245,24 @@ void I422ToABGRRow_NEON(const uint8* src_y, uint8* dst_abgr, int width) { asm volatile ( - MEMACCESS(5) - "vld1.8 {d24}, [%5] \n" - MEMACCESS(6) - "vld1.8 {d25}, [%6] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV422 - YUV422TORGB + YUV422TORGB(v20, v21, v22) "subs %4, %4, #8 \n" - "vswp.u8 d20, d22 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" /* A */ MEMACCESS(3) - "vst4.8 {d20, d21, d22, d23}, [%3]! \n" + "st4 {v20.8b-v23.8b}, [%3], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(src_u), // %1 "+r"(src_v), // %2 "+r"(dst_abgr), // %3 "+r"(width) // %4 - : "r"(&kUVToRB), // %5 - "r"(&kUVToG) // %6 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_I422TOABGRROW_NEON @@ -312,31 +274,24 @@ void I422ToRGBARow_NEON(const uint8* src_y, uint8* dst_rgba, int width) { asm volatile ( - MEMACCESS(5) - "vld1.8 {d24}, [%5] \n" - MEMACCESS(6) - "vld1.8 {d25}, [%6] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV422 - YUV422TORGB + YUV422TORGB(v23, v22, v21) "subs %4, %4, #8 \n" - "vmov.u8 d19, #255 \n" + "movi v20.8b, #255 \n" /* A */ MEMACCESS(3) - "vst4.8 {d19, d20, d21, d22}, [%3]! \n" + "st4 {v20.8b-v23.8b}, [%3], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(src_u), // %1 "+r"(src_v), // %2 "+r"(dst_rgba), // %3 "+r"(width) // %4 - : "r"(&kUVToRB), // %5 - "r"(&kUVToG) // %6 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_I422TORGBAROW_NEON @@ -348,30 +303,23 @@ void I422ToRGB24Row_NEON(const uint8* src_y, uint8* dst_rgb24, int width) { asm volatile ( - MEMACCESS(5) - "vld1.8 {d24}, [%5] \n" - MEMACCESS(6) - "vld1.8 {d25}, [%6] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV422 - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %4, %4, #8 \n" MEMACCESS(3) - "vst3.8 {d20, d21, d22}, [%3]! \n" - "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_rgb24), // %3 - "+r"(width) // %4 - : "r"(&kUVToRB), // %5 - "r"(&kUVToG) // %6 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + "st3 {v20.8b-v22.8b}, [%3], #24 \n" + "b.gt 1b \n" + : "+r"(src_y), // %0 + "+r"(src_u), // %1 + "+r"(src_v), // %2 + "+r"(dst_rgb24), // %3 + "+r"(width) // %4 + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_I422TORGB24ROW_NEON @@ -383,31 +331,23 @@ void I422ToRAWRow_NEON(const uint8* src_y, uint8* dst_raw, int width) { asm volatile ( - MEMACCESS(5) - "vld1.8 {d24}, [%5] \n" - MEMACCESS(6) - "vld1.8 {d25}, [%6] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV422 - YUV422TORGB + YUV422TORGB(v20, v21, v22) "subs %4, %4, #8 \n" - "vswp.u8 d20, d22 \n" MEMACCESS(3) - "vst3.8 {d20, d21, d22}, [%3]! \n" + "st3 {v20.8b-v22.8b}, [%3], #24 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_raw), // %3 - "+r"(width) // %4 - : "r"(&kUVToRB), // %5 - "r"(&kUVToG) // %6 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : "+r"(src_y), // %0 + "+r"(src_u), // %1 + "+r"(src_v), // %2 + "+r"(dst_raw), // %3 + "+r"(width) // %4 + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_I422TORAWROW_NEON @@ -554,29 +494,22 @@ void YToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width) { asm volatile ( - MEMACCESS(3) - "vld1.8 {d24}, [%3] \n" - MEMACCESS(4) - "vld1.8 {d25}, [%4] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUV400 - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %2, %2, #8 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" MEMACCESS(1) - "vst4.8 {d20, d21, d22, d23}, [%1]! \n" + "st4 {v20.8b-v23.8b}, [%1], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(dst_argb), // %1 "+r"(width) // %2 - : "r"(&kUVToRB), // %3 - "r"(&kUVToG) // %4 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_YTOARGBROW_NEON @@ -587,21 +520,21 @@ void I400ToARGBRow_NEON(const uint8* src_y, int width) { asm volatile ( ".p2align 2 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" "1: \n" MEMACCESS(0) - "vld1.8 {d20}, [%0]! \n" - "vmov d21, d20 \n" - "vmov d22, d20 \n" + "ld1 {v20.8b}, [%0], #8 \n" + "mov v21.8b, v20.8b \n" + "mov v22.8b, v20.8b \n" "subs %2, %2, #8 \n" MEMACCESS(1) - "vst4.8 {d20, d21, d22, d23}, [%1]! \n" + "st4 {v20.8b-v23.8b}, [%1], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(dst_argb), // %1 "+r"(width) // %2 : - : "cc", "memory", "d20", "d21", "d22", "d23" + : "cc", "memory", "v20", "v21", "v22", "v23" ); } #endif // HAS_I400TOARGBROW_NEON @@ -612,30 +545,23 @@ void NV12ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width) { asm volatile ( - MEMACCESS(4) - "vld1.8 {d24}, [%4] \n" - MEMACCESS(5) - "vld1.8 {d25}, [%5] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READNV12 - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %3, %3, #8 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" MEMACCESS(2) - "vst4.8 {d20, d21, d22, d23}, [%2]! \n" + "st4 {v20.8b-v23.8b}, [%2], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(src_uv), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 - : "r"(&kUVToRB), // %4 - "r"(&kUVToG) // %5 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_NV12TOARGBROW_NEON @@ -646,30 +572,23 @@ void NV21ToARGBRow_NEON(const uint8* src_y, uint8* dst_argb, int width) { asm volatile ( - MEMACCESS(4) - "vld1.8 {d24}, [%4] \n" - MEMACCESS(5) - "vld1.8 {d25}, [%5] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READNV21 - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %3, %3, #8 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" MEMACCESS(2) - "vst4.8 {d20, d21, d22, d23}, [%2]! \n" + "st4 {v20.8b-v23.8b}, [%2], #32 \n" "b.gt 1b \n" : "+r"(src_y), // %0 "+r"(src_uv), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 - : "r"(&kUVToRB), // %4 - "r"(&kUVToG) // %5 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", + "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_NV21TOARGBROW_NEON @@ -747,29 +666,22 @@ void YUY2ToARGBRow_NEON(const uint8* src_yuy2, uint8* dst_argb, int width) { asm volatile ( - MEMACCESS(3) - "vld1.8 {d24}, [%3] \n" - MEMACCESS(4) - "vld1.8 {d25}, [%4] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READYUY2 - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %2, %2, #8 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" MEMACCESS(1) - "vst4.8 {d20, d21, d22, d23}, [%1]! \n" + "st4 {v20.8b-v23.8b}, [%1], #32 \n" "b.gt 1b \n" : "+r"(src_yuy2), // %0 "+r"(dst_argb), // %1 "+r"(width) // %2 - : "r"(&kUVToRB), // %3 - "r"(&kUVToG) // %4 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_YUY2TOARGBROW_NEON @@ -779,29 +691,22 @@ void UYVYToARGBRow_NEON(const uint8* src_uyvy, uint8* dst_argb, int width) { asm volatile ( - MEMACCESS(3) - "vld1.8 {d24}, [%3] \n" - MEMACCESS(4) - "vld1.8 {d25}, [%4] \n" - "vmov.u8 d26, #128 \n" - "vmov.u16 q14, #74 \n" - "vmov.u16 q15, #16 \n" + YUV422TORGB_SETUP_REG ".p2align 2 \n" "1: \n" READUYVY - YUV422TORGB + YUV422TORGB(v22, v21, v20) "subs %2, %2, #8 \n" - "vmov.u8 d23, #255 \n" + "movi v23.8b, #255 \n" MEMACCESS(1) - "vst4.8 {d20, d21, d22, d23}, [%1]! \n" + "st4 {v20.8b-v23.8b}, [%1], 32 \n" "b.gt 1b \n" : "+r"(src_uyvy), // %0 "+r"(dst_argb), // %1 "+r"(width) // %2 - : "r"(&kUVToRB), // %3 - "r"(&kUVToG) // %4 - : "cc", "memory", "q0", "q1", "q2", "q3", - "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15" + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", + "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" ); } #endif // HAS_UYVYTOARGBROW_NEON |