From 275913410d879df91edd1648dfee19207870264b Mon Sep 17 00:00:00 2001 From: "fbarchard@google.com" Date: Wed, 26 Sep 2012 17:55:37 +0000 Subject: [PATCH] Redo register usage for Neon to avoid callee saved d8 - d15. Use d0 - d7 instead. BUG=64 TEST=none Review URL: https://webrtc-codereview.appspot.com/846005 git-svn-id: http://libyuv.googlecode.com/svn/trunk@378 16f28f9a-4ce2-e073-06de-1de4eb20be90 --- README.chromium | 2 +- include/libyuv/version.h | 2 +- source/row_neon.cc | 83 ++++++++++++++++++++-------------------- 3 files changed, 43 insertions(+), 44 deletions(-) diff --git a/README.chromium b/README.chromium index d2fffc933..774e48671 100644 --- a/README.chromium +++ b/README.chromium @@ -1,6 +1,6 @@ Name: libyuv URL: http://code.google.com/p/libyuv/ -Version: 377 +Version: 378 License: BSD License File: LICENSE diff --git a/include/libyuv/version.h b/include/libyuv/version.h index 844ad4670..18ab5af48 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 377 +#define LIBYUV_VERSION 378 #endif // INCLUDE_LIBYUV_VERSION_H_ NOLINT diff --git a/source/row_neon.cc b/source/row_neon.cc index 6988766be..cabffb1fe 100644 --- a/source/row_neon.cc +++ b/source/row_neon.cc @@ -202,7 +202,7 @@ void SplitUV_NEON(const uint8* src_uv, uint8* dst_u, uint8* dst_v, int width) { "+r"(dst_v), // %2 "+r"(width) // %3 // Output registers : // Input registers - : "memory", "cc", "q0", "q1" // Clobber List + : "memory", "cc", "q0", "q1" // Clobber List ); } #endif // HAS_SPLITUV_NEON @@ -221,7 +221,7 @@ void CopyRow_NEON(const uint8* src, uint8* dst, int count) { "+r"(dst), // %1 "+r"(count) // %2 // Output registers : // Input registers - : "memory", "cc", "q0", "q1", "q2", "q3" // Clobber List + : "memory", "cc", "q0", "q1", "q2", "q3" // Clobber List ); } #endif // HAS_COPYROW_NEON @@ -360,22 +360,21 @@ void MirrorRowUV_NEON(const uint8* src, uint8* dst_a, uint8* dst_b, int width) { } #endif // HAS_MIRRORROWUV_NEON -// TODO(fbarchard): Avoid d4-d7. #ifdef HAS_BGRATOARGBROW_NEON void BGRAToARGBRow_NEON(const uint8* src_bgra, uint8* dst_argb, int pix) { asm volatile ( "1: \n" - "vld4.8 {d5, d6, d7, d8}, [%0]! \n" // load 8 pixels of BGRA. + "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of BGRA. "subs %2, %2, #8 \n" // 8 processed per loop. - "vswp.u8 d6, d7 \n" // swap G, R - "vswp.u8 d5, d8 \n" // swap B, A - "vst4.8 {d5, d6, d7, d8}, [%1]! \n" // store 8 pixels of ARGB. + "vswp.u8 d1, d2 \n" // swap G, R + "vswp.u8 d0, d3 \n" // swap B, A + "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB. "bgt 1b \n" : "+r"(src_bgra), // %0 "+r"(dst_argb), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d5", "d6", "d7", "d8" // Clobber List + : "memory", "cc", "d0", "d1", "d2", "d3" // Clobber List ); } #endif // HAS_BGRATOARGBROW_NEON @@ -384,16 +383,16 @@ void BGRAToARGBRow_NEON(const uint8* src_bgra, uint8* dst_argb, int pix) { void ABGRToARGBRow_NEON(const uint8* src_abgr, uint8* dst_argb, int pix) { asm volatile ( "1: \n" - "vld4.8 {d5, d6, d7, d8}, [%0]! \n" // load 8 pixels of ABGR. + "vld4.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of ABGR. "subs %2, %2, #8 \n" // 8 processed per loop. - "vswp.u8 d5, d7 \n" // swap R, B - "vst4.8 {d5, d6, d7, d8}, [%1]! \n" // store 8 pixels of ARGB. + "vswp.u8 d0, d2 \n" // swap R, B + "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of ARGB. "bgt 1b \n" : "+r"(src_abgr), // %0 "+r"(dst_argb), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d5", "d6", "d7", "d8" // Clobber List + : "memory", "cc", "d0", "d1", "d2", "d3" // Clobber List ); } #endif // HAS_ABGRTOARGBROW_NEON @@ -402,16 +401,16 @@ void ABGRToARGBRow_NEON(const uint8* src_abgr, uint8* dst_argb, int pix) { void RGBAToARGBRow_NEON(const uint8* src_rgba, uint8* dst_argb, int pix) { asm volatile ( "1: \n" - "vld4.8 {d5, d6, d7, d8}, [%0]! \n" // load 8 pixels of RGBA. + "vld1.8 {d0, d1, d2, d3}, [%0]! \n" // load 8 pixels of RGBA. "subs %2, %2, #8 \n" // 8 processed per loop. - "vmov.u8 d9, d5 \n" // move A after RGB - "vst4.8 {d6, d7, d8, d9}, [%1]! \n" // store 8 pixels of ARGB. + "vmov.u8 d4, d0 \n" // move A after RGB + "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB. "bgt 1b \n" : "+r"(src_rgba), // %0 "+r"(dst_argb), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d5", "d6", "d7", "d8", "d9" // Clobber List + : "memory", "cc", "d0", "d1", "d2", "d3", "d4" // Clobber List ); } #endif // HAS_RGBATOARGBROW_NEON @@ -419,17 +418,17 @@ void RGBAToARGBRow_NEON(const uint8* src_rgba, uint8* dst_argb, int pix) { #ifdef HAS_RGB24TOARGBROW_NEON void RGB24ToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int pix) { asm volatile ( - "vmov.u8 d8, #255 \n" // Alpha + "vmov.u8 d4, #255 \n" // Alpha "1: \n" - "vld3.8 {d5, d6, d7}, [%0]! \n" // load 8 pixels of RGB24. + "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RGB24. "subs %2, %2, #8 \n" // 8 processed per loop. - "vst4.8 {d5, d6, d7, d8}, [%1]! \n" // store 8 pixels of ARGB. + "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB. "bgt 1b \n" : "+r"(src_rgb24), // %0 "+r"(dst_argb), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d5", "d6", "d7", "d8" // Clobber List + : "memory", "cc", "d1", "d2", "d3", "d4" // Clobber List ); } #endif // HAS_RGB24TOARGBROW_NEON @@ -437,18 +436,18 @@ void RGB24ToARGBRow_NEON(const uint8* src_rgb24, uint8* dst_argb, int pix) { #ifdef HAS_RAWTOARGBROW_NEON void RAWToARGBRow_NEON(const uint8* src_raw, uint8* dst_argb, int pix) { asm volatile ( - "vmov.u8 d8, #255 \n" // Alpha + "vmov.u8 d4, #255 \n" // Alpha "1: \n" - "vld3.8 {d5, d6, d7}, [%0]! \n" // load 8 pixels of RAW. + "vld3.8 {d1, d2, d3}, [%0]! \n" // load 8 pixels of RAW. "subs %2, %2, #8 \n" // 8 processed per loop. - "vswp.u8 d5, d7 \n" // swap R, B - "vst4.8 {d5, d6, d7, d8}, [%1]! \n" // store 8 pixels of ARGB. + "vswp.u8 d1, d3 \n" // swap R, B + "vst4.8 {d1, d2, d3, d4}, [%1]! \n" // store 8 pixels of ARGB. "bgt 1b \n" : "+r"(src_raw), // %0 "+r"(dst_argb), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d5", "d6", "d7", "d8" // Clobber List + : "memory", "cc", "d1", "d2", "d3", "d4" // Clobber List ); } #endif // HAS_RAWTOARGBROW_NEON @@ -457,16 +456,16 @@ void RAWToARGBRow_NEON(const uint8* src_raw, uint8* dst_argb, int pix) { void ARGBToRGBARow_NEON(const uint8* src_argb, uint8* dst_rgba, int pix) { asm volatile ( "1: \n" - "vld4.8 {d5, d6, d7, d8}, [%0]! \n" // load 8 pixels of ARGB. + "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB. "subs %2, %2, #8 \n" // 8 processed per loop. - "vmov.u8 d4, d8 \n" // move A before RGB. - "vst4.8 {d4, d5, d6, d7}, [%1]! \n" // store 8 pixels of RGBA. + "vmov.u8 d0, d4 \n" // move A before RGB. + "vst4.8 {d0, d1, d2, d3}, [%1]! \n" // store 8 pixels of RGBA. "bgt 1b \n" : "+r"(src_argb), // %0 "+r"(dst_rgba), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d4", "d5", "d6", "d7", "d8" // Clobber List + : "memory", "cc", "d0", "d1", "d2", "d3", "d4" // Clobber List ); } #endif // HAS_ARGBTORGBAROW_NEON @@ -475,15 +474,15 @@ void ARGBToRGBARow_NEON(const uint8* src_argb, uint8* dst_rgba, int pix) { void ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb24, int pix) { asm volatile ( "1: \n" - "vld4.8 {d5, d6, d7, d8}, [%0]! \n" // load 8 pixels of ARGB. + "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB. "subs %2, %2, #8 \n" // 8 processed per loop. - "vst3.8 {d5, d6, d7}, [%1]! \n" // store 8 pixels of RGB24. + "vst3.8 {d1, d2, d3}, [%1]! \n" // store 8 pixels of RGB24. "bgt 1b \n" : "+r"(src_argb), // %0 "+r"(dst_rgb24), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d5", "d6", "d7", "d8" // Clobber List + : "memory", "cc", "d1", "d2", "d3", "d4" // Clobber List ); } #endif // HAS_ARGBTORGB24ROW_NEON @@ -492,16 +491,16 @@ void ARGBToRGB24Row_NEON(const uint8* src_argb, uint8* dst_rgb24, int pix) { void ARGBToRAWRow_NEON(const uint8* src_argb, uint8* dst_raw, int pix) { asm volatile ( "1: \n" - "vld4.8 {d5, d6, d7, d8}, [%0]! \n" // load 8 pixels of ARGB. - "vswp.u8 d5, d7 \n" // swap R, B + "vld4.8 {d1, d2, d3, d4}, [%0]! \n" // load 8 pixels of ARGB. + "vswp.u8 d1, d3 \n" // swap R, B "subs %2, %2, #8 \n" // 8 processed per loop. - "vst3.8 {d5, d6, d7}, [%1]! \n" // store 8 pixels of RAW. + "vst3.8 {d1, d2, d3}, [%1]! \n" // store 8 pixels of RAW. "bgt 1b \n" : "+r"(src_argb), // %0 "+r"(dst_raw), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d5", "d6", "d7", "d8" // Clobber List + : "memory", "cc", "d1", "d2", "d3", "d4" // Clobber List ); } #endif // HAS_ARGBTORAWROW_NEON @@ -518,7 +517,7 @@ void YUY2ToYRow_NEON(const uint8* src_yuy2, uint8* dst_y, int pix) { "+r"(dst_y), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d0", "d1" // Clobber List + : "memory", "cc", "d0", "d1" // Clobber List ); } #endif // HAS_YUY2TOYROW_NEON @@ -535,7 +534,7 @@ void UYVYToYRow_NEON(const uint8* src_uyvy, uint8* dst_y, int pix) { "+r"(dst_y), // %1 "+r"(pix) // %2 : - : "memory", "cc", "d0", "d1" // Clobber List + : "memory", "cc", "d0", "d1" // Clobber List ); } #endif // HAS_UYVYTOYROW_NEON @@ -555,7 +554,7 @@ void YUY2ToUV422Row_NEON(const uint8* src_yuy2, uint8* dst_u, uint8* dst_v, "+r"(dst_v), // %2 "+r"(pix) // %3 : - : "memory", "cc", "d0", "d1", "d2", "d3" // Clobber List + : "memory", "cc", "d0", "d1", "d2", "d3" // Clobber List ); } #endif // HAS_YUY2TOYROW_NEON @@ -575,7 +574,7 @@ void UYVYToUV422Row_NEON(const uint8* src_uyvy, uint8* dst_u, uint8* dst_v, "+r"(dst_v), // %2 "+r"(pix) // %3 : - : "memory", "cc", "d0", "d1", "d2", "d3" // Clobber List + : "memory", "cc", "d0", "d1", "d2", "d3" // Clobber List ); } #endif // HAS_UYVYTOYROW_NEON @@ -600,7 +599,7 @@ void YUY2ToUVRow_NEON(const uint8* src_yuy2, int stride_yuy2, "+r"(dst_v), // %3 "+r"(pix) // %4 : - : "memory", "cc", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7" // Clobber List + : "memory", "cc", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7" // Clobber List ); } #endif // HAS_YUY2TOYROW_NEON @@ -625,7 +624,7 @@ void UYVYToUVRow_NEON(const uint8* src_uyvy, int stride_uyvy, "+r"(dst_v), // %3 "+r"(pix) // %4 : - : "memory", "cc", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7" // Clobber List + : "memory", "cc", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7" // Clobber List ); } #endif // HAS_UYVYTOYROW_NEON