Index: source/row_neon64.cc |
diff --git a/source/row_neon64.cc b/source/row_neon64.cc |
index e89d5acad1efd516cbf82e6d7c314563644e3c72..b13000b4b26c397935da38bb414f011e2e6d4155 100644 |
--- a/source/row_neon64.cc |
+++ b/source/row_neon64.cc |
@@ -91,16 +91,13 @@ extern "C" { |
"uzp2 v3.8b, v2.8b, v2.8b \n" \ |
"ins v1.s[1], v3.s[0] \n" |
-// TODO(fbarchard): replace movi with constants from struct. |
#define YUVTORGB_SETUP \ |
"ld1r {v24.8h}, [%[kUVBiasBGR]], #2 \n" \ |
"ld1r {v25.8h}, [%[kUVBiasBGR]], #2 \n" \ |
"ld1r {v26.8h}, [%[kUVBiasBGR]] \n" \ |
"ld1r {v31.4s}, [%[kYToRgb]] \n" \ |
- "movi v27.8h, #128 \n" \ |
- "movi v28.8h, #102 \n" \ |
- "movi v29.8h, #25 \n" \ |
- "movi v30.8h, #52 \n" |
+ "ld1 {v27.8h, v28.8h}, [%[kUVToRB]] \n" \ |
+ "ld1 {v29.8h, v30.8h}, [%[kUVToG]] \n" |
#define YUVTORGB(vR, vG, vB) \ |
"uxtl v0.8h, v0.8b \n" /* Extract Y */ \ |
@@ -161,7 +158,9 @@ void I444ToARGBRow_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_argb), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
[kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
@@ -192,8 +191,10 @@ void I422ToARGBRow_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_argb), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -222,8 +223,10 @@ void I411ToARGBRow_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_argb), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -252,8 +255,10 @@ void I422ToBGRARow_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_bgra), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -283,8 +288,10 @@ void I422ToABGRRow_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_abgr), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -313,8 +320,10 @@ void I422ToRGBARow_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_rgba), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -342,8 +351,10 @@ void I422ToRGB24Row_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_rgb24), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -371,8 +382,10 @@ void I422ToRAWRow_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_raw), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -408,8 +421,10 @@ void I422ToRGB565Row_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_rgb565), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -448,8 +463,10 @@ void I422ToARGB1555Row_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_argb1555), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -490,8 +507,10 @@ void I422ToARGB4444Row_NEON(const uint8* src_y, |
"+r"(src_v), // %2 |
"+r"(dst_argb4444), // %3 |
"+r"(width) // %4 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -516,7 +535,9 @@ void I400ToARGBRow_NEON(const uint8* src_y, |
: "+r"(src_y), // %0 |
"+r"(dst_argb), // %1 |
"+r"(width64) // %2 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
+ : [kUVToRB]"r"(&kYuvConstants.kUVToRB), |
+ [kUVToG]"r"(&kYuvConstants.kUVToG), |
+ [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
[kYToRgb]"r"(&kYuvConstants.kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
@@ -568,8 +589,10 @@ void NV12ToARGBRow_NEON(const uint8* src_y, |
"+r"(src_uv), // %1 |
"+r"(dst_argb), // %2 |
"+r"(width) // %3 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -596,8 +619,10 @@ void NV21ToARGBRow_NEON(const uint8* src_y, |
"+r"(src_vu), // %1 |
"+r"(dst_argb), // %2 |
"+r"(width) // %3 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -624,8 +649,10 @@ void NV12ToRGB565Row_NEON(const uint8* src_y, |
"+r"(src_uv), // %1 |
"+r"(dst_rgb565), // %2 |
"+r"(width) // %3 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -651,8 +678,10 @@ void YUY2ToARGBRow_NEON(const uint8* src_yuy2, |
: "+r"(src_yuy2), // %0 |
"+r"(dst_argb), // %1 |
"+r"(width64) // %2 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |
@@ -678,8 +707,10 @@ void UYVYToARGBRow_NEON(const uint8* src_uyvy, |
: "+r"(src_uyvy), // %0 |
"+r"(dst_argb), // %1 |
"+r"(width64) // %2 |
- : [kUVBiasBGR]"r"(&kYuvConstants.kUVBiasBGR), |
- [kYToRgb]"r"(&kYuvConstants.kYToRgb) |
+ : [kUVToRB]"r"(&yuvconstants->kUVToRB), |
+ [kUVToG]"r"(&yuvconstants->kUVToG), |
+ [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), |
+ [kYToRgb]"r"(&yuvconstants->kYToRgb) |
: "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", |
"v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" |
); |