mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-06 16:56:55 +08:00
Add MSA optimized ARGB/ABGR/BGRA/RGBA To Y/UV row functions
R=fbarchard@google.com BUG=libyuv:634 Performance Gain (vs C auto-vectorized) ARGBToYJRow_MSA - ~3.2x ARGBToYJRow_Any_MSA - ~2.7x BGRAToYRow_MSA - ~3.2x BGRAToYRow_Any_MSA - ~2.7x ABGRToYRow_MSA - ~3.2x ABGRToYRow_Any_MSA - ~2.6x RGBAToYRow_MSA - ~3.1x RGBAToYRow_Any_MSA - ~2.7x ARGBToUVJRow_MSA - ~5.5x ARGBToUVJRow_Any_MSA - ~4.5x BGRAToUVRow_MSA - ~2.1x BGRAToUVRow_Any_MSA - ~2.0x ABGRToUVRow_MSA - ~2.1x ABGRToUVRow_Any_MSA - ~1.9x RGBAToUVRow_MSA - ~2.2x RGBAToUVRow_Any_MSA - ~1.9x Performance Gain (vs C non-vectorized) ARGBToYJRow_MSA - ~10.9x ARGBToYJRow_Any_MSA - ~9.2x BGRAToYRow_MSA - ~10.9x BGRAToYRow_Any_MSA - ~9.3x ABGRToYRow_MSA - ~11.0x ABGRToYRow_Any_MSA - ~9.3x RGBAToYRow_MSA - ~10.9x RGBAToYRow_Any_MSA - ~9.1x ARGBToUVJRow_MSA - ~12.4x ARGBToUVJRow_Any_MSA - ~10.5x BGRAToUVRow_MSA - ~4.7x BGRAToUVRow_Any_MSA - ~4.4x ABGRToUVRow_MSA - ~4.7x ABGRToUVRow_Any_MSA - ~4.5x RGBAToUVRow_MSA - ~4.8x RGBAToUVRow_Any_MSA - ~4.4x Review-Url: https://codereview.chromium.org/2641153003 .
This commit is contained in:
parent
0351042197
commit
54ce8f23d6
@ -434,6 +434,14 @@ extern "C" {
|
|||||||
#define HAS_SOBELROW_MSA
|
#define HAS_SOBELROW_MSA
|
||||||
#define HAS_SOBELTOPLANEROW_MSA
|
#define HAS_SOBELTOPLANEROW_MSA
|
||||||
#define HAS_SOBELXYROW_MSA
|
#define HAS_SOBELXYROW_MSA
|
||||||
|
#define HAS_ARGBTOYJROW_MSA
|
||||||
|
#define HAS_BGRATOYROW_MSA
|
||||||
|
#define HAS_ABGRTOYROW_MSA
|
||||||
|
#define HAS_RGBATOYROW_MSA
|
||||||
|
#define HAS_ARGBTOUVJROW_MSA
|
||||||
|
#define HAS_BGRATOUVROW_MSA
|
||||||
|
#define HAS_ABGRTOUVROW_MSA
|
||||||
|
#define HAS_RGBATOUVROW_MSA
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_MSC_VER) && !defined(__CLR_VER) && !defined(__clang__)
|
#if defined(_MSC_VER) && !defined(__CLR_VER) && !defined(__clang__)
|
||||||
@ -843,6 +851,7 @@ void RAWToYRow_SSSE3(const uint8* src_raw, uint8* dst_y, int width);
|
|||||||
void ARGBToYRow_NEON(const uint8* src_argb, uint8* dst_y, int width);
|
void ARGBToYRow_NEON(const uint8* src_argb, uint8* dst_y, int width);
|
||||||
void ARGBToYJRow_NEON(const uint8* src_argb, uint8* dst_y, int width);
|
void ARGBToYJRow_NEON(const uint8* src_argb, uint8* dst_y, int width);
|
||||||
void ARGBToYRow_MSA(const uint8* src_argb, uint8* dst_y, int width);
|
void ARGBToYRow_MSA(const uint8* src_argb, uint8* dst_y, int width);
|
||||||
|
void ARGBToYJRow_MSA(const uint8* src_argb, uint8* dst_y, int width);
|
||||||
void ARGBToUV444Row_NEON(const uint8* src_argb,
|
void ARGBToUV444Row_NEON(const uint8* src_argb,
|
||||||
uint8* dst_u,
|
uint8* dst_u,
|
||||||
uint8* dst_v,
|
uint8* dst_v,
|
||||||
@ -906,6 +915,26 @@ void ARGB4444ToUVRow_NEON(const uint8* src_argb4444,
|
|||||||
uint8* dst_u,
|
uint8* dst_u,
|
||||||
uint8* dst_v,
|
uint8* dst_v,
|
||||||
int width);
|
int width);
|
||||||
|
void ARGBToUVJRow_MSA(const uint8* src_argb,
|
||||||
|
int src_stride_argb,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width);
|
||||||
|
void BGRAToUVRow_MSA(const uint8* src_bgra,
|
||||||
|
int src_stride_bgra,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width);
|
||||||
|
void ABGRToUVRow_MSA(const uint8* src_abgr,
|
||||||
|
int src_stride_abgr,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width);
|
||||||
|
void RGBAToUVRow_MSA(const uint8* src_rgba,
|
||||||
|
int src_stride_rgba,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width);
|
||||||
void RGB24ToUVRow_MSA(const uint8* src_rgb24,
|
void RGB24ToUVRow_MSA(const uint8* src_rgb24,
|
||||||
int src_stride_rgb24,
|
int src_stride_rgb24,
|
||||||
uint8* dst_u,
|
uint8* dst_u,
|
||||||
@ -934,6 +963,9 @@ void RAWToYRow_NEON(const uint8* src_raw, uint8* dst_y, int width);
|
|||||||
void RGB565ToYRow_NEON(const uint8* src_rgb565, uint8* dst_y, int width);
|
void RGB565ToYRow_NEON(const uint8* src_rgb565, uint8* dst_y, int width);
|
||||||
void ARGB1555ToYRow_NEON(const uint8* src_argb1555, uint8* dst_y, int width);
|
void ARGB1555ToYRow_NEON(const uint8* src_argb1555, uint8* dst_y, int width);
|
||||||
void ARGB4444ToYRow_NEON(const uint8* src_argb4444, uint8* dst_y, int width);
|
void ARGB4444ToYRow_NEON(const uint8* src_argb4444, uint8* dst_y, int width);
|
||||||
|
void BGRAToYRow_MSA(const uint8* src_bgra, uint8* dst_y, int width);
|
||||||
|
void ABGRToYRow_MSA(const uint8* src_abgr, uint8* dst_y, int width);
|
||||||
|
void RGBAToYRow_MSA(const uint8* src_rgba, uint8* dst_y, int width);
|
||||||
void RGB24ToYRow_MSA(const uint8* src_rgb24, uint8* dst_y, int width);
|
void RGB24ToYRow_MSA(const uint8* src_rgb24, uint8* dst_y, int width);
|
||||||
void RAWToYRow_MSA(const uint8* src_raw, uint8* dst_y, int width);
|
void RAWToYRow_MSA(const uint8* src_raw, uint8* dst_y, int width);
|
||||||
void RGB565ToYRow_MSA(const uint8* src_rgb565, uint8* dst_y, int width);
|
void RGB565ToYRow_MSA(const uint8* src_rgb565, uint8* dst_y, int width);
|
||||||
@ -997,6 +1029,10 @@ void RGBAToYRow_Any_DSPR2(const uint8* src_rgba, uint8* dst_y, int width);
|
|||||||
void ARGB4444ToYRow_Any_NEON(const uint8* src_argb4444,
|
void ARGB4444ToYRow_Any_NEON(const uint8* src_argb4444,
|
||||||
uint8* dst_y,
|
uint8* dst_y,
|
||||||
int width);
|
int width);
|
||||||
|
void BGRAToYRow_Any_MSA(const uint8* src_bgra, uint8* dst_y, int width);
|
||||||
|
void ABGRToYRow_Any_MSA(const uint8* src_abgr, uint8* dst_y, int width);
|
||||||
|
void RGBAToYRow_Any_MSA(const uint8* src_rgba, uint8* dst_y, int width);
|
||||||
|
void ARGBToYJRow_Any_MSA(const uint8* src_argb, uint8* dst_y, int width);
|
||||||
void ARGBToYRow_Any_MSA(const uint8* src_argb, uint8* dst_y, int width);
|
void ARGBToYRow_Any_MSA(const uint8* src_argb, uint8* dst_y, int width);
|
||||||
void RGB24ToYRow_Any_MSA(const uint8* src_rgb24, uint8* dst_y, int width);
|
void RGB24ToYRow_Any_MSA(const uint8* src_rgb24, uint8* dst_y, int width);
|
||||||
void RAWToYRow_Any_MSA(const uint8* src_raw, uint8* dst_y, int width);
|
void RAWToYRow_Any_MSA(const uint8* src_raw, uint8* dst_y, int width);
|
||||||
@ -1136,6 +1172,26 @@ void ARGB4444ToUVRow_Any_NEON(const uint8* src_argb4444,
|
|||||||
uint8* dst_u,
|
uint8* dst_u,
|
||||||
uint8* dst_v,
|
uint8* dst_v,
|
||||||
int width);
|
int width);
|
||||||
|
void ARGBToUVJRow_Any_MSA(const uint8* src_argb,
|
||||||
|
int src_stride_argb,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width);
|
||||||
|
void BGRAToUVRow_Any_MSA(const uint8* src_bgra,
|
||||||
|
int src_stride_bgra,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width);
|
||||||
|
void ABGRToUVRow_Any_MSA(const uint8* src_abgr,
|
||||||
|
int src_stride_abgr,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width);
|
||||||
|
void RGBAToUVRow_Any_MSA(const uint8* src_rgba,
|
||||||
|
int src_stride_rgba,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width);
|
||||||
void RGB24ToUVRow_Any_MSA(const uint8* src_rgb24,
|
void RGB24ToUVRow_Any_MSA(const uint8* src_rgb24,
|
||||||
int src_stride_rgb24,
|
int src_stride_rgb24,
|
||||||
uint8* dst_u,
|
uint8* dst_u,
|
||||||
|
|||||||
@ -696,6 +696,22 @@ int BGRAToI420(const uint8* src_bgra,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_BGRATOYROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
BGRAToYRow = BGRAToYRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
BGRAToYRow = BGRAToYRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_BGRATOUVROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
BGRAToUVRow = BGRAToUVRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
BGRAToUVRow = BGRAToUVRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (y = 0; y < height - 1; y += 2) {
|
for (y = 0; y < height - 1; y += 2) {
|
||||||
BGRAToUVRow(src_bgra, src_stride_bgra, dst_u, dst_v, width);
|
BGRAToUVRow(src_bgra, src_stride_bgra, dst_u, dst_v, width);
|
||||||
@ -781,6 +797,22 @@ int ABGRToI420(const uint8* src_abgr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_ABGRTOYROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ABGRToYRow = ABGRToYRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ABGRToYRow = ABGRToYRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_ABGRTOUVROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ABGRToUVRow = ABGRToUVRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ABGRToUVRow = ABGRToUVRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (y = 0; y < height - 1; y += 2) {
|
for (y = 0; y < height - 1; y += 2) {
|
||||||
ABGRToUVRow(src_abgr, src_stride_abgr, dst_u, dst_v, width);
|
ABGRToUVRow(src_abgr, src_stride_abgr, dst_u, dst_v, width);
|
||||||
@ -866,6 +898,22 @@ int RGBAToI420(const uint8* src_rgba,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_RGBATOYROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
RGBAToYRow = RGBAToYRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
RGBAToYRow = RGBAToYRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_RGBATOUVROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
RGBAToUVRow = RGBAToUVRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
RGBAToUVRow = RGBAToUVRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (y = 0; y < height - 1; y += 2) {
|
for (y = 0; y < height - 1; y += 2) {
|
||||||
RGBAToUVRow(src_rgba, src_stride_rgba, dst_u, dst_v, width);
|
RGBAToUVRow(src_rgba, src_stride_rgba, dst_u, dst_v, width);
|
||||||
|
|||||||
@ -1352,6 +1352,22 @@ int ARGBToJ420(const uint8* src_argb,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_ARGBTOYJROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ARGBToYJRow = ARGBToYJRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYJRow = ARGBToYJRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_ARGBTOUVJROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ARGBToUVJRow = ARGBToUVJRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 32)) {
|
||||||
|
ARGBToUVJRow = ARGBToUVJRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (y = 0; y < height - 1; y += 2) {
|
for (y = 0; y < height - 1; y += 2) {
|
||||||
ARGBToUVJRow(src_argb, src_stride_argb, dst_u, dst_v, width);
|
ARGBToUVJRow(src_argb, src_stride_argb, dst_u, dst_v, width);
|
||||||
@ -1436,6 +1452,22 @@ int ARGBToJ422(const uint8* src_argb,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_ARGBTOYJROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ARGBToYJRow = ARGBToYJRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYJRow = ARGBToYJRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_ARGBTOUVJROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ARGBToUVJRow = ARGBToUVJRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 32)) {
|
||||||
|
ARGBToUVJRow = ARGBToUVJRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (y = 0; y < height; ++y) {
|
for (y = 0; y < height; ++y) {
|
||||||
ARGBToUVJRow(src_argb, 0, dst_u, dst_v, width);
|
ARGBToUVJRow(src_argb, 0, dst_u, dst_v, width);
|
||||||
@ -1497,6 +1529,14 @@ int ARGBToJ400(const uint8* src_argb,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_ARGBTOYJROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ARGBToYJRow = ARGBToYJRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYJRow = ARGBToYJRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
for (y = 0; y < height; ++y) {
|
for (y = 0; y < height; ++y) {
|
||||||
ARGBToYJRow(src_argb, dst_yj, width);
|
ARGBToYJRow(src_argb, dst_yj, width);
|
||||||
|
|||||||
@ -2564,6 +2564,14 @@ static int ARGBSobelize(const uint8* src_argb,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_ARGBTOYJROW_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ARGBToYJRow = ARGBToYJRow_Any_MSA;
|
||||||
|
if (IS_ALIGNED(width, 16)) {
|
||||||
|
ARGBToYJRow = ARGBToYJRow_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(HAS_SOBELYROW_SSE2)
|
#if defined(HAS_SOBELYROW_SSE2)
|
||||||
if (TestCpuFlag(kCpuHasSSE2)) {
|
if (TestCpuFlag(kCpuHasSSE2)) {
|
||||||
|
|||||||
@ -460,15 +460,27 @@ ANY11(ARGBToYRow_Any_MSA, ARGBToYRow_MSA, 0, 4, 1, 15)
|
|||||||
#ifdef HAS_ARGBTOYJROW_NEON
|
#ifdef HAS_ARGBTOYJROW_NEON
|
||||||
ANY11(ARGBToYJRow_Any_NEON, ARGBToYJRow_NEON, 0, 4, 1, 7)
|
ANY11(ARGBToYJRow_Any_NEON, ARGBToYJRow_NEON, 0, 4, 1, 7)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_ARGBTOYJROW_MSA
|
||||||
|
ANY11(ARGBToYJRow_Any_MSA, ARGBToYJRow_MSA, 0, 4, 1, 15)
|
||||||
|
#endif
|
||||||
#ifdef HAS_BGRATOYROW_NEON
|
#ifdef HAS_BGRATOYROW_NEON
|
||||||
ANY11(BGRAToYRow_Any_NEON, BGRAToYRow_NEON, 0, 4, 1, 7)
|
ANY11(BGRAToYRow_Any_NEON, BGRAToYRow_NEON, 0, 4, 1, 7)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_BGRATOYROW_MSA
|
||||||
|
ANY11(BGRAToYRow_Any_MSA, BGRAToYRow_MSA, 0, 4, 1, 15)
|
||||||
|
#endif
|
||||||
#ifdef HAS_ABGRTOYROW_NEON
|
#ifdef HAS_ABGRTOYROW_NEON
|
||||||
ANY11(ABGRToYRow_Any_NEON, ABGRToYRow_NEON, 0, 4, 1, 7)
|
ANY11(ABGRToYRow_Any_NEON, ABGRToYRow_NEON, 0, 4, 1, 7)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_ABGRTOYROW_MSA
|
||||||
|
ANY11(ABGRToYRow_Any_MSA, ABGRToYRow_MSA, 0, 4, 1, 7)
|
||||||
|
#endif
|
||||||
#ifdef HAS_RGBATOYROW_NEON
|
#ifdef HAS_RGBATOYROW_NEON
|
||||||
ANY11(RGBAToYRow_Any_NEON, RGBAToYRow_NEON, 0, 4, 1, 7)
|
ANY11(RGBAToYRow_Any_NEON, RGBAToYRow_NEON, 0, 4, 1, 7)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_RGBATOYROW_MSA
|
||||||
|
ANY11(RGBAToYRow_Any_MSA, RGBAToYRow_MSA, 0, 4, 1, 15)
|
||||||
|
#endif
|
||||||
#ifdef HAS_RGB24TOYROW_NEON
|
#ifdef HAS_RGB24TOYROW_NEON
|
||||||
ANY11(RGB24ToYRow_Any_NEON, RGB24ToYRow_NEON, 0, 3, 1, 7)
|
ANY11(RGB24ToYRow_Any_NEON, RGB24ToYRow_NEON, 0, 3, 1, 7)
|
||||||
#endif
|
#endif
|
||||||
@ -952,15 +964,27 @@ ANY12S(ARGBToUVRow_Any_MSA, ARGBToUVRow_MSA, 0, 4, 31)
|
|||||||
#ifdef HAS_ARGBTOUVJROW_NEON
|
#ifdef HAS_ARGBTOUVJROW_NEON
|
||||||
ANY12S(ARGBToUVJRow_Any_NEON, ARGBToUVJRow_NEON, 0, 4, 15)
|
ANY12S(ARGBToUVJRow_Any_NEON, ARGBToUVJRow_NEON, 0, 4, 15)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_ARGBTOUVJROW_MSA
|
||||||
|
ANY12S(ARGBToUVJRow_Any_MSA, ARGBToUVJRow_MSA, 0, 4, 31)
|
||||||
|
#endif
|
||||||
#ifdef HAS_BGRATOUVROW_NEON
|
#ifdef HAS_BGRATOUVROW_NEON
|
||||||
ANY12S(BGRAToUVRow_Any_NEON, BGRAToUVRow_NEON, 0, 4, 15)
|
ANY12S(BGRAToUVRow_Any_NEON, BGRAToUVRow_NEON, 0, 4, 15)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_BGRATOUVROW_MSA
|
||||||
|
ANY12S(BGRAToUVRow_Any_MSA, BGRAToUVRow_MSA, 0, 4, 31)
|
||||||
|
#endif
|
||||||
#ifdef HAS_ABGRTOUVROW_NEON
|
#ifdef HAS_ABGRTOUVROW_NEON
|
||||||
ANY12S(ABGRToUVRow_Any_NEON, ABGRToUVRow_NEON, 0, 4, 15)
|
ANY12S(ABGRToUVRow_Any_NEON, ABGRToUVRow_NEON, 0, 4, 15)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_ABGRTOUVROW_MSA
|
||||||
|
ANY12S(ABGRToUVRow_Any_MSA, ABGRToUVRow_MSA, 0, 4, 31)
|
||||||
|
#endif
|
||||||
#ifdef HAS_RGBATOUVROW_NEON
|
#ifdef HAS_RGBATOUVROW_NEON
|
||||||
ANY12S(RGBAToUVRow_Any_NEON, RGBAToUVRow_NEON, 0, 4, 15)
|
ANY12S(RGBAToUVRow_Any_NEON, RGBAToUVRow_NEON, 0, 4, 15)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_RGBATOUVROW_MSA
|
||||||
|
ANY12S(RGBAToUVRow_Any_MSA, RGBAToUVRow_MSA, 0, 4, 31)
|
||||||
|
#endif
|
||||||
#ifdef HAS_RGB24TOUVROW_NEON
|
#ifdef HAS_RGB24TOUVROW_NEON
|
||||||
ANY12S(RGB24ToUVRow_Any_NEON, RGB24ToUVRow_NEON, 0, 3, 15)
|
ANY12S(RGB24ToUVRow_Any_NEON, RGB24ToUVRow_NEON, 0, 3, 15)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -52,15 +52,15 @@ extern "C" {
|
|||||||
v8i16 vec0_m, vec1_m; \
|
v8i16 vec0_m, vec1_m; \
|
||||||
v4i32 reg0_m, reg1_m, reg2_m, reg3_m, reg4_m; \
|
v4i32 reg0_m, reg1_m, reg2_m, reg3_m, reg4_m; \
|
||||||
v4i32 reg5_m, reg6_m, reg7_m; \
|
v4i32 reg5_m, reg6_m, reg7_m; \
|
||||||
v4i32 max = __msa_ldi_w(255); \
|
v4i32 max_m = __msa_ldi_w(255); \
|
||||||
v16i8 zero = {0}; \
|
v16i8 zero_m = {0}; \
|
||||||
\
|
\
|
||||||
vec0_m = (v8i16)__msa_ilvr_b((v16i8)in_y, (v16i8)in_y); \
|
vec0_m = (v8i16)__msa_ilvr_b((v16i8)in_y, (v16i8)in_y); \
|
||||||
vec1_m = (v8i16)__msa_ilvr_b((v16i8)zero, (v16i8)in_uv); \
|
vec1_m = (v8i16)__msa_ilvr_b((v16i8)zero_m, (v16i8)in_uv); \
|
||||||
reg0_m = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec0_m); \
|
reg0_m = (v4i32)__msa_ilvr_h((v8i16)zero_m, (v8i16)vec0_m); \
|
||||||
reg1_m = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec0_m); \
|
reg1_m = (v4i32)__msa_ilvl_h((v8i16)zero_m, (v8i16)vec0_m); \
|
||||||
reg2_m = (v4i32)__msa_ilvr_h((v8i16)zero, (v8i16)vec1_m); \
|
reg2_m = (v4i32)__msa_ilvr_h((v8i16)zero_m, (v8i16)vec1_m); \
|
||||||
reg3_m = (v4i32)__msa_ilvl_h((v8i16)zero, (v8i16)vec1_m); \
|
reg3_m = (v4i32)__msa_ilvl_h((v8i16)zero_m, (v8i16)vec1_m); \
|
||||||
reg0_m *= yg; \
|
reg0_m *= yg; \
|
||||||
reg1_m *= yg; \
|
reg1_m *= yg; \
|
||||||
reg2_m *= ubvr; \
|
reg2_m *= ubvr; \
|
||||||
@ -98,12 +98,12 @@ extern "C" {
|
|||||||
reg4_m = __msa_maxi_s_w(reg4_m, 0); \
|
reg4_m = __msa_maxi_s_w(reg4_m, 0); \
|
||||||
reg2_m = __msa_maxi_s_w(reg2_m, 0); \
|
reg2_m = __msa_maxi_s_w(reg2_m, 0); \
|
||||||
reg3_m = __msa_maxi_s_w(reg3_m, 0); \
|
reg3_m = __msa_maxi_s_w(reg3_m, 0); \
|
||||||
reg5_m = __msa_min_s_w(max, reg5_m); \
|
reg5_m = __msa_min_s_w(max_m, reg5_m); \
|
||||||
reg6_m = __msa_min_s_w(max, reg6_m); \
|
reg6_m = __msa_min_s_w(max_m, reg6_m); \
|
||||||
reg7_m = __msa_min_s_w(max, reg7_m); \
|
reg7_m = __msa_min_s_w(max_m, reg7_m); \
|
||||||
reg4_m = __msa_min_s_w(max, reg4_m); \
|
reg4_m = __msa_min_s_w(max_m, reg4_m); \
|
||||||
reg2_m = __msa_min_s_w(max, reg2_m); \
|
reg2_m = __msa_min_s_w(max_m, reg2_m); \
|
||||||
reg3_m = __msa_min_s_w(max, reg3_m); \
|
reg3_m = __msa_min_s_w(max_m, reg3_m); \
|
||||||
out_b = __msa_pckev_h((v8i16)reg6_m, (v8i16)reg5_m); \
|
out_b = __msa_pckev_h((v8i16)reg6_m, (v8i16)reg5_m); \
|
||||||
out_g = __msa_pckev_h((v8i16)reg4_m, (v8i16)reg7_m); \
|
out_g = __msa_pckev_h((v8i16)reg4_m, (v8i16)reg7_m); \
|
||||||
out_r = __msa_pckev_h((v8i16)reg3_m, (v8i16)reg2_m); \
|
out_r = __msa_pckev_h((v8i16)reg3_m, (v8i16)reg2_m); \
|
||||||
@ -121,6 +121,146 @@ extern "C" {
|
|||||||
ST_UB2(dst0_m, dst1_m, pdst_argb, 16); \
|
ST_UB2(dst0_m, dst1_m, pdst_argb, 16); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Takes ARGB input and calculates Y.
|
||||||
|
#define ARGBTOY(argb0, argb1, argb2, argb3, const0, const1, const2, shift, \
|
||||||
|
y_out) \
|
||||||
|
{ \
|
||||||
|
v16u8 vec0_m, vec1_m, vec2_m, vec3_m; \
|
||||||
|
v8u16 reg0_m, reg1_m; \
|
||||||
|
\
|
||||||
|
vec0_m = (v16u8)__msa_pckev_h((v8i16)argb1, (v8i16)argb0); \
|
||||||
|
vec1_m = (v16u8)__msa_pckev_h((v8i16)argb3, (v8i16)argb2); \
|
||||||
|
vec2_m = (v16u8)__msa_pckod_h((v8i16)argb1, (v8i16)argb0); \
|
||||||
|
vec3_m = (v16u8)__msa_pckod_h((v8i16)argb3, (v8i16)argb2); \
|
||||||
|
reg0_m = __msa_dotp_u_h(vec0_m, const0); \
|
||||||
|
reg1_m = __msa_dotp_u_h(vec1_m, const0); \
|
||||||
|
reg0_m = __msa_dpadd_u_h(reg0_m, vec2_m, const1); \
|
||||||
|
reg1_m = __msa_dpadd_u_h(reg1_m, vec3_m, const1); \
|
||||||
|
reg0_m += const2; \
|
||||||
|
reg1_m += const2; \
|
||||||
|
reg0_m = (v8u16)__msa_srai_h((v8i16)reg0_m, shift); \
|
||||||
|
reg1_m = (v8u16)__msa_srai_h((v8i16)reg1_m, shift); \
|
||||||
|
y_out = (v16u8)__msa_pckev_b((v16i8)reg1_m, (v16i8)reg0_m); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loads current and next row of ARGB input and averages it to calculate U and V
|
||||||
|
#define READ_ARGB(s_ptr, t_ptr, argb0, argb1, argb2, argb3) \
|
||||||
|
{ \
|
||||||
|
v16u8 src0_m, src1_m, src2_m, src3_m, src4_m, src5_m, src6_m, src7_m; \
|
||||||
|
v16u8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
|
||||||
|
v16u8 vec8_m, vec9_m; \
|
||||||
|
v8u16 reg0_m, reg1_m, reg2_m, reg3_m, reg4_m, reg5_m, reg6_m, reg7_m; \
|
||||||
|
v8u16 reg8_m, reg9_m; \
|
||||||
|
\
|
||||||
|
src0_m = (v16u8)__msa_ld_b((v16i8*)s, 0); \
|
||||||
|
src1_m = (v16u8)__msa_ld_b((v16i8*)s, 16); \
|
||||||
|
src2_m = (v16u8)__msa_ld_b((v16i8*)s, 32); \
|
||||||
|
src3_m = (v16u8)__msa_ld_b((v16i8*)s, 48); \
|
||||||
|
src4_m = (v16u8)__msa_ld_b((v16i8*)t, 0); \
|
||||||
|
src5_m = (v16u8)__msa_ld_b((v16i8*)t, 16); \
|
||||||
|
src6_m = (v16u8)__msa_ld_b((v16i8*)t, 32); \
|
||||||
|
src7_m = (v16u8)__msa_ld_b((v16i8*)t, 48); \
|
||||||
|
vec0_m = (v16u8)__msa_ilvr_b((v16i8)src0_m, (v16i8)src4_m); \
|
||||||
|
vec1_m = (v16u8)__msa_ilvr_b((v16i8)src1_m, (v16i8)src5_m); \
|
||||||
|
vec2_m = (v16u8)__msa_ilvr_b((v16i8)src2_m, (v16i8)src6_m); \
|
||||||
|
vec3_m = (v16u8)__msa_ilvr_b((v16i8)src3_m, (v16i8)src7_m); \
|
||||||
|
vec4_m = (v16u8)__msa_ilvl_b((v16i8)src0_m, (v16i8)src4_m); \
|
||||||
|
vec5_m = (v16u8)__msa_ilvl_b((v16i8)src1_m, (v16i8)src5_m); \
|
||||||
|
vec6_m = (v16u8)__msa_ilvl_b((v16i8)src2_m, (v16i8)src6_m); \
|
||||||
|
vec7_m = (v16u8)__msa_ilvl_b((v16i8)src3_m, (v16i8)src7_m); \
|
||||||
|
reg0_m = __msa_hadd_u_h(vec0_m, vec0_m); \
|
||||||
|
reg1_m = __msa_hadd_u_h(vec1_m, vec1_m); \
|
||||||
|
reg2_m = __msa_hadd_u_h(vec2_m, vec2_m); \
|
||||||
|
reg3_m = __msa_hadd_u_h(vec3_m, vec3_m); \
|
||||||
|
reg4_m = __msa_hadd_u_h(vec4_m, vec4_m); \
|
||||||
|
reg5_m = __msa_hadd_u_h(vec5_m, vec5_m); \
|
||||||
|
reg6_m = __msa_hadd_u_h(vec6_m, vec6_m); \
|
||||||
|
reg7_m = __msa_hadd_u_h(vec7_m, vec7_m); \
|
||||||
|
reg8_m = (v8u16)__msa_pckev_d((v2i64)reg4_m, (v2i64)reg0_m); \
|
||||||
|
reg9_m = (v8u16)__msa_pckev_d((v2i64)reg5_m, (v2i64)reg1_m); \
|
||||||
|
reg8_m += (v8u16)__msa_pckod_d((v2i64)reg4_m, (v2i64)reg0_m); \
|
||||||
|
reg9_m += (v8u16)__msa_pckod_d((v2i64)reg5_m, (v2i64)reg1_m); \
|
||||||
|
reg0_m = (v8u16)__msa_pckev_d((v2i64)reg6_m, (v2i64)reg2_m); \
|
||||||
|
reg1_m = (v8u16)__msa_pckev_d((v2i64)reg7_m, (v2i64)reg3_m); \
|
||||||
|
reg0_m += (v8u16)__msa_pckod_d((v2i64)reg6_m, (v2i64)reg2_m); \
|
||||||
|
reg1_m += (v8u16)__msa_pckod_d((v2i64)reg7_m, (v2i64)reg3_m); \
|
||||||
|
reg8_m = (v8u16)__msa_srai_h((v8i16)reg8_m, 2); \
|
||||||
|
reg9_m = (v8u16)__msa_srai_h((v8i16)reg9_m, 2); \
|
||||||
|
reg0_m = (v8u16)__msa_srai_h((v8i16)reg0_m, 2); \
|
||||||
|
reg1_m = (v8u16)__msa_srai_h((v8i16)reg1_m, 2); \
|
||||||
|
argb0 = (v16u8)__msa_pckev_b((v16i8)reg9_m, (v16i8)reg8_m); \
|
||||||
|
argb1 = (v16u8)__msa_pckev_b((v16i8)reg1_m, (v16i8)reg0_m); \
|
||||||
|
src0_m = (v16u8)__msa_ld_b((v16i8*)s, 64); \
|
||||||
|
src1_m = (v16u8)__msa_ld_b((v16i8*)s, 80); \
|
||||||
|
src2_m = (v16u8)__msa_ld_b((v16i8*)s, 96); \
|
||||||
|
src3_m = (v16u8)__msa_ld_b((v16i8*)s, 112); \
|
||||||
|
src4_m = (v16u8)__msa_ld_b((v16i8*)t, 64); \
|
||||||
|
src5_m = (v16u8)__msa_ld_b((v16i8*)t, 80); \
|
||||||
|
src6_m = (v16u8)__msa_ld_b((v16i8*)t, 96); \
|
||||||
|
src7_m = (v16u8)__msa_ld_b((v16i8*)t, 112); \
|
||||||
|
vec2_m = (v16u8)__msa_ilvr_b((v16i8)src0_m, (v16i8)src4_m); \
|
||||||
|
vec3_m = (v16u8)__msa_ilvr_b((v16i8)src1_m, (v16i8)src5_m); \
|
||||||
|
vec4_m = (v16u8)__msa_ilvr_b((v16i8)src2_m, (v16i8)src6_m); \
|
||||||
|
vec5_m = (v16u8)__msa_ilvr_b((v16i8)src3_m, (v16i8)src7_m); \
|
||||||
|
vec6_m = (v16u8)__msa_ilvl_b((v16i8)src0_m, (v16i8)src4_m); \
|
||||||
|
vec7_m = (v16u8)__msa_ilvl_b((v16i8)src1_m, (v16i8)src5_m); \
|
||||||
|
vec8_m = (v16u8)__msa_ilvl_b((v16i8)src2_m, (v16i8)src6_m); \
|
||||||
|
vec9_m = (v16u8)__msa_ilvl_b((v16i8)src3_m, (v16i8)src7_m); \
|
||||||
|
reg0_m = __msa_hadd_u_h(vec2_m, vec2_m); \
|
||||||
|
reg1_m = __msa_hadd_u_h(vec3_m, vec3_m); \
|
||||||
|
reg2_m = __msa_hadd_u_h(vec4_m, vec4_m); \
|
||||||
|
reg3_m = __msa_hadd_u_h(vec5_m, vec5_m); \
|
||||||
|
reg4_m = __msa_hadd_u_h(vec6_m, vec6_m); \
|
||||||
|
reg5_m = __msa_hadd_u_h(vec7_m, vec7_m); \
|
||||||
|
reg6_m = __msa_hadd_u_h(vec8_m, vec8_m); \
|
||||||
|
reg7_m = __msa_hadd_u_h(vec9_m, vec9_m); \
|
||||||
|
reg8_m = (v8u16)__msa_pckev_d((v2i64)reg4_m, (v2i64)reg0_m); \
|
||||||
|
reg9_m = (v8u16)__msa_pckev_d((v2i64)reg5_m, (v2i64)reg1_m); \
|
||||||
|
reg8_m += (v8u16)__msa_pckod_d((v2i64)reg4_m, (v2i64)reg0_m); \
|
||||||
|
reg9_m += (v8u16)__msa_pckod_d((v2i64)reg5_m, (v2i64)reg1_m); \
|
||||||
|
reg0_m = (v8u16)__msa_pckev_d((v2i64)reg6_m, (v2i64)reg2_m); \
|
||||||
|
reg1_m = (v8u16)__msa_pckev_d((v2i64)reg7_m, (v2i64)reg3_m); \
|
||||||
|
reg0_m += (v8u16)__msa_pckod_d((v2i64)reg6_m, (v2i64)reg2_m); \
|
||||||
|
reg1_m += (v8u16)__msa_pckod_d((v2i64)reg7_m, (v2i64)reg3_m); \
|
||||||
|
reg8_m = (v8u16)__msa_srai_h((v8i16)reg8_m, 2); \
|
||||||
|
reg9_m = (v8u16)__msa_srai_h((v8i16)reg9_m, 2); \
|
||||||
|
reg0_m = (v8u16)__msa_srai_h((v8i16)reg0_m, 2); \
|
||||||
|
reg1_m = (v8u16)__msa_srai_h((v8i16)reg1_m, 2); \
|
||||||
|
argb2 = (v16u8)__msa_pckev_b((v16i8)reg9_m, (v16i8)reg8_m); \
|
||||||
|
argb3 = (v16u8)__msa_pckev_b((v16i8)reg1_m, (v16i8)reg0_m); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// Takes ARGB input and calculates U and V.
|
||||||
|
#define ARGBTOUV(argb0, argb1, argb2, argb3, const0, const1, const2, const3, \
|
||||||
|
shf0, shf1, shf2, shf3, v_out, u_out) \
|
||||||
|
{ \
|
||||||
|
v16u8 vec0_m, vec1_m, vec2_m, vec3_m, vec4_m, vec5_m, vec6_m, vec7_m; \
|
||||||
|
v8u16 reg0_m, reg1_m, reg2_m, reg3_m; \
|
||||||
|
\
|
||||||
|
vec0_m = (v16u8)__msa_vshf_b(shf0, (v16i8)argb1, (v16i8)argb0); \
|
||||||
|
vec1_m = (v16u8)__msa_vshf_b(shf0, (v16i8)argb3, (v16i8)argb2); \
|
||||||
|
vec2_m = (v16u8)__msa_vshf_b(shf1, (v16i8)argb1, (v16i8)argb0); \
|
||||||
|
vec3_m = (v16u8)__msa_vshf_b(shf1, (v16i8)argb3, (v16i8)argb2); \
|
||||||
|
vec4_m = (v16u8)__msa_vshf_b(shf2, (v16i8)argb1, (v16i8)argb0); \
|
||||||
|
vec5_m = (v16u8)__msa_vshf_b(shf2, (v16i8)argb3, (v16i8)argb2); \
|
||||||
|
vec6_m = (v16u8)__msa_vshf_b(shf3, (v16i8)argb1, (v16i8)argb0); \
|
||||||
|
vec7_m = (v16u8)__msa_vshf_b(shf3, (v16i8)argb3, (v16i8)argb2); \
|
||||||
|
reg0_m = __msa_dotp_u_h(vec0_m, const1); \
|
||||||
|
reg1_m = __msa_dotp_u_h(vec1_m, const1); \
|
||||||
|
reg2_m = __msa_dotp_u_h(vec4_m, const1); \
|
||||||
|
reg3_m = __msa_dotp_u_h(vec5_m, const1); \
|
||||||
|
reg0_m += const3; \
|
||||||
|
reg1_m += const3; \
|
||||||
|
reg2_m += const3; \
|
||||||
|
reg3_m += const3; \
|
||||||
|
reg0_m -= __msa_dotp_u_h(vec2_m, const0); \
|
||||||
|
reg1_m -= __msa_dotp_u_h(vec3_m, const0); \
|
||||||
|
reg2_m -= __msa_dotp_u_h(vec6_m, const2); \
|
||||||
|
reg3_m -= __msa_dotp_u_h(vec7_m, const2); \
|
||||||
|
v_out = (v16u8)__msa_pckod_b((v16i8)reg1_m, (v16i8)reg0_m); \
|
||||||
|
u_out = (v16u8)__msa_pckod_b((v16i8)reg3_m, (v16i8)reg2_m); \
|
||||||
|
}
|
||||||
|
|
||||||
void MirrorRow_MSA(const uint8* src, uint8* dst, int width) {
|
void MirrorRow_MSA(const uint8* src, uint8* dst, int width) {
|
||||||
int x;
|
int x;
|
||||||
v16u8 src0, src1, src2, src3;
|
v16u8 src0, src1, src2, src3;
|
||||||
@ -2240,6 +2380,256 @@ void SobelXYRow_MSA(const uint8* src_sobelx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ARGBToYJRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
|
||||||
|
int x;
|
||||||
|
v16u8 src0, src1, src2, src3, dst0;
|
||||||
|
v16u8 const_0x4B0F = (v16u8)__msa_fill_h(0x4B0F);
|
||||||
|
v16u8 const_0x26 = (v16u8)__msa_fill_h(0x26);
|
||||||
|
v8u16 const_0x40 = (v8u16)__msa_fill_h(0x40);
|
||||||
|
|
||||||
|
for (x = 0; x < width; x += 16) {
|
||||||
|
src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
|
||||||
|
src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
|
||||||
|
src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
|
||||||
|
src3 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 48);
|
||||||
|
ARGBTOY(src0, src1, src2, src3, const_0x4B0F, const_0x26, const_0x40, 7,
|
||||||
|
dst0);
|
||||||
|
ST_UB(dst0, dst_y);
|
||||||
|
src_argb0 += 64;
|
||||||
|
dst_y += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BGRAToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
|
||||||
|
int x;
|
||||||
|
v16u8 src0, src1, src2, src3, dst0;
|
||||||
|
v16u8 const_0x4200 = (v16u8)__msa_fill_h(0x4200);
|
||||||
|
v16u8 const_0x1981 = (v16u8)__msa_fill_h(0x1981);
|
||||||
|
v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
|
||||||
|
|
||||||
|
for (x = 0; x < width; x += 16) {
|
||||||
|
src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
|
||||||
|
src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
|
||||||
|
src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
|
||||||
|
src3 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 48);
|
||||||
|
ARGBTOY(src0, src1, src2, src3, const_0x4200, const_0x1981, const_0x1080, 8,
|
||||||
|
dst0);
|
||||||
|
ST_UB(dst0, dst_y);
|
||||||
|
src_argb0 += 64;
|
||||||
|
dst_y += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ABGRToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
|
||||||
|
int x;
|
||||||
|
v16u8 src0, src1, src2, src3, dst0;
|
||||||
|
v16u8 const_0x8142 = (v16u8)__msa_fill_h(0x8142);
|
||||||
|
v16u8 const_0x19 = (v16u8)__msa_fill_h(0x19);
|
||||||
|
v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
|
||||||
|
|
||||||
|
for (x = 0; x < width; x += 16) {
|
||||||
|
src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
|
||||||
|
src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
|
||||||
|
src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
|
||||||
|
src3 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 48);
|
||||||
|
ARGBTOY(src0, src1, src2, src3, const_0x8142, const_0x19, const_0x1080, 8,
|
||||||
|
dst0);
|
||||||
|
ST_UB(dst0, dst_y);
|
||||||
|
src_argb0 += 64;
|
||||||
|
dst_y += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RGBAToYRow_MSA(const uint8* src_argb0, uint8* dst_y, int width) {
|
||||||
|
int x;
|
||||||
|
v16u8 src0, src1, src2, src3, dst0;
|
||||||
|
v16u8 const_0x1900 = (v16u8)__msa_fill_h(0x1900);
|
||||||
|
v16u8 const_0x4281 = (v16u8)__msa_fill_h(0x4281);
|
||||||
|
v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080);
|
||||||
|
|
||||||
|
for (x = 0; x < width; x += 16) {
|
||||||
|
src0 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 0);
|
||||||
|
src1 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 16);
|
||||||
|
src2 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 32);
|
||||||
|
src3 = (v16u8)__msa_ld_b((v16i8*)src_argb0, 48);
|
||||||
|
ARGBTOY(src0, src1, src2, src3, const_0x1900, const_0x4281, const_0x1080, 8,
|
||||||
|
dst0);
|
||||||
|
ST_UB(dst0, dst_y);
|
||||||
|
src_argb0 += 64;
|
||||||
|
dst_y += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ARGBToUVJRow_MSA(const uint8* src_rgb0,
|
||||||
|
int src_stride_rgb,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width) {
|
||||||
|
int x;
|
||||||
|
const uint8* s = src_rgb0;
|
||||||
|
const uint8* t = src_rgb0 + src_stride_rgb;
|
||||||
|
v16u8 src0, src1, src2, src3, src4, src5, src6, src7;
|
||||||
|
v16u8 vec0, vec1, vec2, vec3;
|
||||||
|
v16u8 dst0, dst1;
|
||||||
|
v16i8 shuffler0 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
|
||||||
|
v16i8 shuffler1 = {2, 3, 6, 7, 10, 11, 14, 15,
|
||||||
|
18, 19, 22, 23, 26, 27, 30, 31};
|
||||||
|
v16i8 shuffler2 = {0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20, 23, 24, 27, 28, 31};
|
||||||
|
v16i8 shuffler3 = {1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30};
|
||||||
|
v16u8 const_0x7F = (v16u8)__msa_fill_h(0x7F);
|
||||||
|
v16u8 const_0x6B14 = (v16u8)__msa_fill_h(0x6B14);
|
||||||
|
v16u8 const_0x2B54 = (v16u8)__msa_fill_h(0x2B54);
|
||||||
|
v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
|
||||||
|
|
||||||
|
for (x = 0; x < width; x += 32) {
|
||||||
|
src0 = (v16u8)__msa_ld_b((v16i8*)s, 0);
|
||||||
|
src1 = (v16u8)__msa_ld_b((v16i8*)s, 16);
|
||||||
|
src2 = (v16u8)__msa_ld_b((v16i8*)s, 32);
|
||||||
|
src3 = (v16u8)__msa_ld_b((v16i8*)s, 48);
|
||||||
|
src4 = (v16u8)__msa_ld_b((v16i8*)t, 0);
|
||||||
|
src5 = (v16u8)__msa_ld_b((v16i8*)t, 16);
|
||||||
|
src6 = (v16u8)__msa_ld_b((v16i8*)t, 32);
|
||||||
|
src7 = (v16u8)__msa_ld_b((v16i8*)t, 48);
|
||||||
|
src0 = __msa_aver_u_b(src0, src4);
|
||||||
|
src1 = __msa_aver_u_b(src1, src5);
|
||||||
|
src2 = __msa_aver_u_b(src2, src6);
|
||||||
|
src3 = __msa_aver_u_b(src3, src7);
|
||||||
|
src4 = (v16u8)__msa_pckev_w((v4i32)src1, (v4i32)src0);
|
||||||
|
src5 = (v16u8)__msa_pckev_w((v4i32)src3, (v4i32)src2);
|
||||||
|
src6 = (v16u8)__msa_pckod_w((v4i32)src1, (v4i32)src0);
|
||||||
|
src7 = (v16u8)__msa_pckod_w((v4i32)src3, (v4i32)src2);
|
||||||
|
vec0 = __msa_aver_u_b(src4, src6);
|
||||||
|
vec1 = __msa_aver_u_b(src5, src7);
|
||||||
|
src0 = (v16u8)__msa_ld_b((v16i8*)s, 64);
|
||||||
|
src1 = (v16u8)__msa_ld_b((v16i8*)s, 80);
|
||||||
|
src2 = (v16u8)__msa_ld_b((v16i8*)s, 96);
|
||||||
|
src3 = (v16u8)__msa_ld_b((v16i8*)s, 112);
|
||||||
|
src4 = (v16u8)__msa_ld_b((v16i8*)t, 64);
|
||||||
|
src5 = (v16u8)__msa_ld_b((v16i8*)t, 80);
|
||||||
|
src6 = (v16u8)__msa_ld_b((v16i8*)t, 96);
|
||||||
|
src7 = (v16u8)__msa_ld_b((v16i8*)t, 112);
|
||||||
|
src0 = __msa_aver_u_b(src0, src4);
|
||||||
|
src1 = __msa_aver_u_b(src1, src5);
|
||||||
|
src2 = __msa_aver_u_b(src2, src6);
|
||||||
|
src3 = __msa_aver_u_b(src3, src7);
|
||||||
|
src4 = (v16u8)__msa_pckev_w((v4i32)src1, (v4i32)src0);
|
||||||
|
src5 = (v16u8)__msa_pckev_w((v4i32)src3, (v4i32)src2);
|
||||||
|
src6 = (v16u8)__msa_pckod_w((v4i32)src1, (v4i32)src0);
|
||||||
|
src7 = (v16u8)__msa_pckod_w((v4i32)src3, (v4i32)src2);
|
||||||
|
vec2 = __msa_aver_u_b(src4, src6);
|
||||||
|
vec3 = __msa_aver_u_b(src5, src7);
|
||||||
|
ARGBTOUV(vec0, vec1, vec2, vec3, const_0x6B14, const_0x7F, const_0x2B54,
|
||||||
|
const_0x8080, shuffler1, shuffler0, shuffler2, shuffler3, dst0,
|
||||||
|
dst1);
|
||||||
|
ST_UB(dst0, dst_v);
|
||||||
|
ST_UB(dst1, dst_u);
|
||||||
|
s += 128;
|
||||||
|
t += 128;
|
||||||
|
dst_v += 16;
|
||||||
|
dst_u += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BGRAToUVRow_MSA(const uint8* src_rgb0,
|
||||||
|
int src_stride_rgb,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width) {
|
||||||
|
int x;
|
||||||
|
const uint8* s = src_rgb0;
|
||||||
|
const uint8* t = src_rgb0 + src_stride_rgb;
|
||||||
|
v16u8 dst0, dst1, vec0, vec1, vec2, vec3;
|
||||||
|
v16i8 shuffler0 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
|
||||||
|
v16i8 shuffler1 = {2, 3, 6, 7, 10, 11, 14, 15,
|
||||||
|
18, 19, 22, 23, 26, 27, 30, 31};
|
||||||
|
v16i8 shuffler2 = {0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20, 23, 24, 27, 28, 31};
|
||||||
|
v16i8 shuffler3 = {2, 1, 6, 5, 10, 9, 14, 13, 18, 17, 22, 21, 26, 25, 30, 29};
|
||||||
|
v16u8 const_0x125E = (v16u8)__msa_fill_h(0x125E);
|
||||||
|
v16u8 const_0x7000 = (v16u8)__msa_fill_h(0x7000);
|
||||||
|
v16u8 const_0x264A = (v16u8)__msa_fill_h(0x264A);
|
||||||
|
v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
|
||||||
|
|
||||||
|
for (x = 0; x < width; x += 32) {
|
||||||
|
READ_ARGB(s, t, vec0, vec1, vec2, vec3);
|
||||||
|
ARGBTOUV(vec0, vec1, vec2, vec3, const_0x125E, const_0x7000, const_0x264A,
|
||||||
|
const_0x8080, shuffler0, shuffler1, shuffler2, shuffler3, dst0,
|
||||||
|
dst1);
|
||||||
|
ST_UB(dst0, dst_v);
|
||||||
|
ST_UB(dst1, dst_u);
|
||||||
|
s += 128;
|
||||||
|
t += 128;
|
||||||
|
dst_v += 16;
|
||||||
|
dst_u += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ABGRToUVRow_MSA(const uint8* src_rgb0,
|
||||||
|
int src_stride_rgb,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width) {
|
||||||
|
int x;
|
||||||
|
const uint8* s = src_rgb0;
|
||||||
|
const uint8* t = src_rgb0 + src_stride_rgb;
|
||||||
|
v16u8 src0, src1, src2, src3;
|
||||||
|
v16u8 dst0, dst1;
|
||||||
|
v16i8 shuffler0 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
|
||||||
|
v16i8 shuffler1 = {2, 3, 6, 7, 10, 11, 14, 15,
|
||||||
|
18, 19, 22, 23, 26, 27, 30, 31};
|
||||||
|
v16i8 shuffler2 = {0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20, 23, 24, 27, 28, 31};
|
||||||
|
v16i8 shuffler3 = {1, 2, 5, 6, 9, 10, 13, 14, 17, 18, 21, 22, 25, 26, 29, 30};
|
||||||
|
v16u8 const_0x4A26 = (v16u8)__msa_fill_h(0x4A26);
|
||||||
|
v16u8 const_0x0070 = (v16u8)__msa_fill_h(0x0070);
|
||||||
|
v16u8 const_0x125E = (v16u8)__msa_fill_h(0x125E);
|
||||||
|
v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
|
||||||
|
|
||||||
|
for (x = 0; x < width; x += 32) {
|
||||||
|
READ_ARGB(s, t, src0, src1, src2, src3);
|
||||||
|
ARGBTOUV(src0, src1, src2, src3, const_0x4A26, const_0x0070, const_0x125E,
|
||||||
|
const_0x8080, shuffler1, shuffler0, shuffler2, shuffler3, dst0,
|
||||||
|
dst1);
|
||||||
|
ST_UB(dst0, dst_u);
|
||||||
|
ST_UB(dst1, dst_v);
|
||||||
|
s += 128;
|
||||||
|
t += 128;
|
||||||
|
dst_u += 16;
|
||||||
|
dst_v += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RGBAToUVRow_MSA(const uint8* src_rgb0,
|
||||||
|
int src_stride_rgb,
|
||||||
|
uint8* dst_u,
|
||||||
|
uint8* dst_v,
|
||||||
|
int width) {
|
||||||
|
int x;
|
||||||
|
const uint8* s = src_rgb0;
|
||||||
|
const uint8* t = src_rgb0 + src_stride_rgb;
|
||||||
|
v16u8 dst0, dst1, vec0, vec1, vec2, vec3;
|
||||||
|
v16i8 shuffler0 = {0, 1, 4, 5, 8, 9, 12, 13, 16, 17, 20, 21, 24, 25, 28, 29};
|
||||||
|
v16i8 shuffler1 = {2, 3, 6, 7, 10, 11, 14, 15,
|
||||||
|
18, 19, 22, 23, 26, 27, 30, 31};
|
||||||
|
v16i8 shuffler2 = {0, 3, 4, 7, 8, 11, 12, 15, 16, 19, 20, 23, 24, 27, 28, 31};
|
||||||
|
v16i8 shuffler3 = {2, 1, 6, 5, 10, 9, 14, 13, 18, 17, 22, 21, 26, 25, 30, 29};
|
||||||
|
v16u8 const_0x125E = (v16u8)__msa_fill_h(0x264A);
|
||||||
|
v16u8 const_0x7000 = (v16u8)__msa_fill_h(0x7000);
|
||||||
|
v16u8 const_0x264A = (v16u8)__msa_fill_h(0x125E);
|
||||||
|
v8u16 const_0x8080 = (v8u16)__msa_fill_h(0x8080);
|
||||||
|
|
||||||
|
for (x = 0; x < width; x += 32) {
|
||||||
|
READ_ARGB(s, t, vec0, vec1, vec2, vec3);
|
||||||
|
ARGBTOUV(vec0, vec1, vec2, vec3, const_0x125E, const_0x7000, const_0x264A,
|
||||||
|
const_0x8080, shuffler0, shuffler1, shuffler2, shuffler3, dst0,
|
||||||
|
dst1);
|
||||||
|
ST_UB(dst0, dst_u);
|
||||||
|
ST_UB(dst1, dst_v);
|
||||||
|
s += 128;
|
||||||
|
t += 128;
|
||||||
|
dst_u += 16;
|
||||||
|
dst_v += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
} // namespace libyuv
|
} // namespace libyuv
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user