Commit 27591341 authored by fbarchard@google.com's avatar fbarchard@google.com

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
parent aa4750f8
Name: libyuv
URL: http://code.google.com/p/libyuv/
Version: 377
Version: 378
License: BSD
License File: LICENSE
......
......@@ -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
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment