mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2025-12-07 01:06:46 +08:00
Add MSA optimized ScaleFilterCols, ScaleARGBCols, ScaleARGBFilterCols and ScaleRowDown34 functions
TBR=kjellander@chromium.org R=fbarchard@google.com Bug:libyuv:634 Change-Id: Ib139b9701fc67e24d27a6886377c0cb8b2773fda Reviewed-on: https://chromium-review.googlesource.com/620791 Reviewed-by: Frank Barchard <fbarchard@google.com>
This commit is contained in:
parent
78e44628c6
commit
8cd3e4f3f2
@ -114,9 +114,14 @@ extern "C" {
|
|||||||
#define HAS_SCALEROWDOWN2_MSA
|
#define HAS_SCALEROWDOWN2_MSA
|
||||||
#define HAS_SCALEROWDOWN4_MSA
|
#define HAS_SCALEROWDOWN4_MSA
|
||||||
#define HAS_SCALEADDROW_MSA
|
#define HAS_SCALEADDROW_MSA
|
||||||
|
#define HAS_SCALEARGBCOLS_MSA
|
||||||
|
#define HAS_SCALEROWDOWN34_MSA
|
||||||
|
|
||||||
#ifndef DISABLE_CLANG_MSA
|
#ifndef DISABLE_CLANG_MSA
|
||||||
#define HAS_SCALEARGBROWDOWNEVEN_MSA
|
#define HAS_SCALEARGBROWDOWNEVEN_MSA
|
||||||
#define HAS_SCALEROWDOWN38_MSA
|
#define HAS_SCALEROWDOWN38_MSA
|
||||||
|
#define HAS_SCALEFILTERCOLS_MSA
|
||||||
|
#define HAS_SCALEARGBFILTERCOLS_MSA
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -553,6 +558,26 @@ void ScaleARGBCols_Any_NEON(uint8* dst_argb,
|
|||||||
int dst_width,
|
int dst_width,
|
||||||
int x,
|
int x,
|
||||||
int dx);
|
int dx);
|
||||||
|
void ScaleARGBFilterCols_MSA(uint8* dst_argb,
|
||||||
|
const uint8* src_argb,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx);
|
||||||
|
void ScaleARGBCols_MSA(uint8* dst_argb,
|
||||||
|
const uint8* src_argb,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx);
|
||||||
|
void ScaleARGBFilterCols_Any_MSA(uint8* dst_argb,
|
||||||
|
const uint8* src_argb,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx);
|
||||||
|
void ScaleARGBCols_Any_MSA(uint8* dst_argb,
|
||||||
|
const uint8* src_argb,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx);
|
||||||
|
|
||||||
// ARGB Row functions
|
// ARGB Row functions
|
||||||
void ScaleARGBRowDown2_SSE2(const uint8* src_argb,
|
void ScaleARGBRowDown2_SSE2(const uint8* src_argb,
|
||||||
@ -892,6 +917,24 @@ void ScaleRowDown38_3_Box_MSA(const uint8_t* src_ptr,
|
|||||||
uint8_t* dst_ptr,
|
uint8_t* dst_ptr,
|
||||||
int dst_width);
|
int dst_width);
|
||||||
void ScaleAddRow_MSA(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
|
void ScaleAddRow_MSA(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width);
|
||||||
|
void ScaleFilterCols_MSA(uint8* dst_ptr,
|
||||||
|
const uint8* src_ptr,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx);
|
||||||
|
void ScaleRowDown34_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* dst_ptr,
|
||||||
|
int dst_width);
|
||||||
|
void ScaleRowDown34_0_Box_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* dst_ptr,
|
||||||
|
int dst_width);
|
||||||
|
void ScaleRowDown34_1_Box_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* dst_ptr,
|
||||||
|
int dst_width);
|
||||||
|
|
||||||
void ScaleRowDown2_Any_MSA(const uint8_t* src_ptr,
|
void ScaleRowDown2_Any_MSA(const uint8_t* src_ptr,
|
||||||
ptrdiff_t src_stride,
|
ptrdiff_t src_stride,
|
||||||
uint8_t* dst,
|
uint8_t* dst,
|
||||||
@ -927,6 +970,23 @@ void ScaleRowDown38_3_Box_Any_MSA(const uint8_t* src_ptr,
|
|||||||
void ScaleAddRow_Any_MSA(const uint8_t* src_ptr,
|
void ScaleAddRow_Any_MSA(const uint8_t* src_ptr,
|
||||||
uint16_t* dst_ptr,
|
uint16_t* dst_ptr,
|
||||||
int src_width);
|
int src_width);
|
||||||
|
void ScaleFilterCols_Any_MSA(uint8* dst_ptr,
|
||||||
|
const uint8* src_ptr,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx);
|
||||||
|
void ScaleRowDown34_Any_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* dst_ptr,
|
||||||
|
int dst_width);
|
||||||
|
void ScaleRowDown34_0_Box_Any_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* dst_ptr,
|
||||||
|
int dst_width);
|
||||||
|
void ScaleRowDown34_1_Box_Any_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* dst_ptr,
|
||||||
|
int dst_width);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|||||||
@ -371,6 +371,26 @@ static void ScalePlaneDown34(int src_width,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_SCALEROWDOWN34_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
if (!filtering) {
|
||||||
|
ScaleRowDown34_0 = ScaleRowDown34_Any_MSA;
|
||||||
|
ScaleRowDown34_1 = ScaleRowDown34_Any_MSA;
|
||||||
|
} else {
|
||||||
|
ScaleRowDown34_0 = ScaleRowDown34_0_Box_Any_MSA;
|
||||||
|
ScaleRowDown34_1 = ScaleRowDown34_1_Box_Any_MSA;
|
||||||
|
}
|
||||||
|
if (dst_width % 48 == 0) {
|
||||||
|
if (!filtering) {
|
||||||
|
ScaleRowDown34_0 = ScaleRowDown34_MSA;
|
||||||
|
ScaleRowDown34_1 = ScaleRowDown34_MSA;
|
||||||
|
} else {
|
||||||
|
ScaleRowDown34_0 = ScaleRowDown34_0_Box_MSA;
|
||||||
|
ScaleRowDown34_1 = ScaleRowDown34_1_Box_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if defined(HAS_SCALEROWDOWN34_SSSE3)
|
#if defined(HAS_SCALEROWDOWN34_SSSE3)
|
||||||
if (TestCpuFlag(kCpuHasSSSE3)) {
|
if (TestCpuFlag(kCpuHasSSSE3)) {
|
||||||
if (!filtering) {
|
if (!filtering) {
|
||||||
@ -1078,6 +1098,14 @@ void ScalePlaneBilinearDown(int src_width,
|
|||||||
ScaleFilterCols = ScaleFilterCols_NEON;
|
ScaleFilterCols = ScaleFilterCols_NEON;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_SCALEFILTERCOLS_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA) && src_width < 32768) {
|
||||||
|
ScaleFilterCols = ScaleFilterCols_Any_MSA;
|
||||||
|
if (IS_ALIGNED(dst_width, 16)) {
|
||||||
|
ScaleFilterCols = ScaleFilterCols_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (y > max_y) {
|
if (y > max_y) {
|
||||||
y = max_y;
|
y = max_y;
|
||||||
@ -1276,6 +1304,14 @@ void ScalePlaneBilinearUp(int src_width,
|
|||||||
ScaleFilterCols = ScaleFilterCols_NEON;
|
ScaleFilterCols = ScaleFilterCols_NEON;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_SCALEFILTERCOLS_MSA)
|
||||||
|
if (filtering && TestCpuFlag(kCpuHasMSA) && src_width < 32768) {
|
||||||
|
ScaleFilterCols = ScaleFilterCols_Any_MSA;
|
||||||
|
if (IS_ALIGNED(dst_width, 16)) {
|
||||||
|
ScaleFilterCols = ScaleFilterCols_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
|
if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
|
||||||
ScaleFilterCols = ScaleColsUp2_C;
|
ScaleFilterCols = ScaleColsUp2_C;
|
||||||
|
|||||||
@ -33,9 +33,15 @@ extern "C" {
|
|||||||
#ifdef HAS_SCALEFILTERCOLS_NEON
|
#ifdef HAS_SCALEFILTERCOLS_NEON
|
||||||
CANY(ScaleFilterCols_Any_NEON, ScaleFilterCols_NEON, ScaleFilterCols_C, 1, 7)
|
CANY(ScaleFilterCols_Any_NEON, ScaleFilterCols_NEON, ScaleFilterCols_C, 1, 7)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_SCALEFILTERCOLS_MSA
|
||||||
|
CANY(ScaleFilterCols_Any_MSA, ScaleFilterCols_MSA, ScaleFilterCols_C, 1, 15)
|
||||||
|
#endif
|
||||||
#ifdef HAS_SCALEARGBCOLS_NEON
|
#ifdef HAS_SCALEARGBCOLS_NEON
|
||||||
CANY(ScaleARGBCols_Any_NEON, ScaleARGBCols_NEON, ScaleARGBCols_C, 4, 7)
|
CANY(ScaleARGBCols_Any_NEON, ScaleARGBCols_NEON, ScaleARGBCols_C, 4, 7)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_SCALEARGBCOLS_MSA
|
||||||
|
CANY(ScaleARGBCols_Any_MSA, ScaleARGBCols_MSA, ScaleARGBCols_C, 4, 3)
|
||||||
|
#endif
|
||||||
#ifdef HAS_SCALEARGBFILTERCOLS_NEON
|
#ifdef HAS_SCALEARGBFILTERCOLS_NEON
|
||||||
CANY(ScaleARGBFilterCols_Any_NEON,
|
CANY(ScaleARGBFilterCols_Any_NEON,
|
||||||
ScaleARGBFilterCols_NEON,
|
ScaleARGBFilterCols_NEON,
|
||||||
@ -43,6 +49,13 @@ CANY(ScaleARGBFilterCols_Any_NEON,
|
|||||||
4,
|
4,
|
||||||
3)
|
3)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_SCALEARGBFILTERCOLS_MSA
|
||||||
|
CANY(ScaleARGBFilterCols_Any_MSA,
|
||||||
|
ScaleARGBFilterCols_MSA,
|
||||||
|
ScaleARGBFilterCols_C,
|
||||||
|
4,
|
||||||
|
7)
|
||||||
|
#endif
|
||||||
#undef CANY
|
#undef CANY
|
||||||
|
|
||||||
// Fixed scale down.
|
// Fixed scale down.
|
||||||
@ -228,6 +241,26 @@ SDANY(ScaleRowDown34_1_Box_Any_NEON,
|
|||||||
1,
|
1,
|
||||||
23)
|
23)
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAS_SCALEROWDOWN34_MSA
|
||||||
|
SDANY(ScaleRowDown34_Any_MSA,
|
||||||
|
ScaleRowDown34_MSA,
|
||||||
|
ScaleRowDown34_C,
|
||||||
|
4 / 3,
|
||||||
|
1,
|
||||||
|
47)
|
||||||
|
SDANY(ScaleRowDown34_0_Box_Any_MSA,
|
||||||
|
ScaleRowDown34_0_Box_MSA,
|
||||||
|
ScaleRowDown34_0_Box_C,
|
||||||
|
4 / 3,
|
||||||
|
1,
|
||||||
|
47)
|
||||||
|
SDANY(ScaleRowDown34_1_Box_Any_MSA,
|
||||||
|
ScaleRowDown34_1_Box_MSA,
|
||||||
|
ScaleRowDown34_1_Box_C,
|
||||||
|
4 / 3,
|
||||||
|
1,
|
||||||
|
47)
|
||||||
|
#endif
|
||||||
#ifdef HAS_SCALEROWDOWN38_SSSE3
|
#ifdef HAS_SCALEROWDOWN38_SSSE3
|
||||||
SDANY(ScaleRowDown38_Any_SSSE3,
|
SDANY(ScaleRowDown38_Any_SSSE3,
|
||||||
ScaleRowDown38_SSSE3,
|
ScaleRowDown38_SSSE3,
|
||||||
|
|||||||
@ -335,6 +335,14 @@ static void ScaleARGBBilinearDown(int src_width,
|
|||||||
ScaleARGBFilterCols = ScaleARGBFilterCols_NEON;
|
ScaleARGBFilterCols = ScaleARGBFilterCols_NEON;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_SCALEARGBFILTERCOLS_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBFilterCols_Any_MSA;
|
||||||
|
if (IS_ALIGNED(dst_width, 8)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBFilterCols_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
// TODO(fbarchard): Consider not allocating row buffer for kFilterLinear.
|
// TODO(fbarchard): Consider not allocating row buffer for kFilterLinear.
|
||||||
// Allocate a row of ARGB.
|
// Allocate a row of ARGB.
|
||||||
@ -442,6 +450,14 @@ static void ScaleARGBBilinearUp(int src_width,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_SCALEARGBFILTERCOLS_MSA)
|
||||||
|
if (filtering && TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBFilterCols_Any_MSA;
|
||||||
|
if (IS_ALIGNED(dst_width, 8)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBFilterCols_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if defined(HAS_SCALEARGBCOLS_SSE2)
|
#if defined(HAS_SCALEARGBCOLS_SSE2)
|
||||||
if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
|
if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
|
||||||
ScaleARGBFilterCols = ScaleARGBCols_SSE2;
|
ScaleARGBFilterCols = ScaleARGBCols_SSE2;
|
||||||
@ -454,6 +470,14 @@ static void ScaleARGBBilinearUp(int src_width,
|
|||||||
ScaleARGBFilterCols = ScaleARGBCols_NEON;
|
ScaleARGBFilterCols = ScaleARGBCols_NEON;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_SCALEARGBCOLS_MSA)
|
||||||
|
if (!filtering && TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBCols_Any_MSA;
|
||||||
|
if (IS_ALIGNED(dst_width, 4)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBCols_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
|
if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
|
||||||
ScaleARGBFilterCols = ScaleARGBColsUp2_C;
|
ScaleARGBFilterCols = ScaleARGBColsUp2_C;
|
||||||
@ -643,6 +667,14 @@ static void ScaleYUVToARGBBilinearUp(int src_width,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(HAS_SCALEARGBFILTERCOLS_MSA)
|
||||||
|
if (filtering && TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBFilterCols_Any_MSA;
|
||||||
|
if (IS_ALIGNED(dst_width, 8)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBFilterCols_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if defined(HAS_SCALEARGBCOLS_SSE2)
|
#if defined(HAS_SCALEARGBCOLS_SSE2)
|
||||||
if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
|
if (!filtering && TestCpuFlag(kCpuHasSSE2) && src_width < 32768) {
|
||||||
ScaleARGBFilterCols = ScaleARGBCols_SSE2;
|
ScaleARGBFilterCols = ScaleARGBCols_SSE2;
|
||||||
@ -655,6 +687,14 @@ static void ScaleYUVToARGBBilinearUp(int src_width,
|
|||||||
ScaleARGBFilterCols = ScaleARGBCols_NEON;
|
ScaleARGBFilterCols = ScaleARGBCols_NEON;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_SCALEARGBCOLS_MSA)
|
||||||
|
if (!filtering && TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBCols_Any_MSA;
|
||||||
|
if (IS_ALIGNED(dst_width, 4)) {
|
||||||
|
ScaleARGBFilterCols = ScaleARGBCols_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
|
if (!filtering && src_width * 2 == dst_width && x < 0x8000) {
|
||||||
ScaleARGBFilterCols = ScaleARGBColsUp2_C;
|
ScaleARGBFilterCols = ScaleARGBColsUp2_C;
|
||||||
@ -778,6 +818,14 @@ static void ScaleARGBSimple(int src_width,
|
|||||||
ScaleARGBCols = ScaleARGBCols_NEON;
|
ScaleARGBCols = ScaleARGBCols_NEON;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(HAS_SCALEARGBCOLS_MSA)
|
||||||
|
if (TestCpuFlag(kCpuHasMSA)) {
|
||||||
|
ScaleARGBCols = ScaleARGBCols_Any_MSA;
|
||||||
|
if (IS_ALIGNED(dst_width, 4)) {
|
||||||
|
ScaleARGBCols = ScaleARGBCols_MSA;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if (src_width * 2 == dst_width && x < 0x8000) {
|
if (src_width * 2 == dst_width && x < 0x8000) {
|
||||||
ScaleARGBCols = ScaleARGBColsUp2_C;
|
ScaleARGBCols = ScaleARGBColsUp2_C;
|
||||||
|
|||||||
@ -21,6 +21,14 @@ namespace libyuv {
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define LOAD_INDEXED_DATA(srcp, indx0, out0) \
|
||||||
|
{ \
|
||||||
|
out0[0] = srcp[indx0[0]]; \
|
||||||
|
out0[1] = srcp[indx0[1]]; \
|
||||||
|
out0[2] = srcp[indx0[2]]; \
|
||||||
|
out0[3] = srcp[indx0[3]]; \
|
||||||
|
}
|
||||||
|
|
||||||
void ScaleARGBRowDown2_MSA(const uint8_t* src_argb,
|
void ScaleARGBRowDown2_MSA(const uint8_t* src_argb,
|
||||||
ptrdiff_t src_stride,
|
ptrdiff_t src_stride,
|
||||||
uint8_t* dst_argb,
|
uint8_t* dst_argb,
|
||||||
@ -549,6 +557,398 @@ void ScaleAddRow_MSA(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef DISABLE_CLANG_MSA
|
||||||
|
void ScaleFilterCols_MSA(uint8* dst_ptr,
|
||||||
|
const uint8* src_ptr,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx) {
|
||||||
|
int j;
|
||||||
|
v4i32 vec_x = __msa_fill_w(x);
|
||||||
|
v4i32 vec_dx = __msa_fill_w(dx);
|
||||||
|
v4i32 vec_const = {0, 1, 2, 3};
|
||||||
|
v4i32 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9;
|
||||||
|
v4i32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
|
||||||
|
v8u16 reg0, reg1;
|
||||||
|
v16u8 dst0;
|
||||||
|
v4i32 const_0xFFFF = __msa_fill_w(0xFFFF);
|
||||||
|
v4i32 const_0x40 = __msa_fill_w(0x40);
|
||||||
|
|
||||||
|
vec0 = vec_dx * vec_const;
|
||||||
|
vec1 = vec_dx * 4;
|
||||||
|
vec_x += vec0;
|
||||||
|
|
||||||
|
for (j = 0; j < dst_width - 1; j += 16) {
|
||||||
|
vec2 = vec_x >> 16;
|
||||||
|
vec6 = vec_x & const_0xFFFF;
|
||||||
|
vec_x += vec1;
|
||||||
|
vec3 = vec_x >> 16;
|
||||||
|
vec7 = vec_x & const_0xFFFF;
|
||||||
|
vec_x += vec1;
|
||||||
|
vec4 = vec_x >> 16;
|
||||||
|
vec8 = vec_x & const_0xFFFF;
|
||||||
|
vec_x += vec1;
|
||||||
|
vec5 = vec_x >> 16;
|
||||||
|
vec9 = vec_x & const_0xFFFF;
|
||||||
|
vec_x += vec1;
|
||||||
|
vec6 >>= 9;
|
||||||
|
vec7 >>= 9;
|
||||||
|
vec8 >>= 9;
|
||||||
|
vec9 >>= 9;
|
||||||
|
LOAD_INDEXED_DATA(src_ptr, vec2, tmp0);
|
||||||
|
LOAD_INDEXED_DATA(src_ptr, vec3, tmp1);
|
||||||
|
LOAD_INDEXED_DATA(src_ptr, vec4, tmp2);
|
||||||
|
LOAD_INDEXED_DATA(src_ptr, vec5, tmp3);
|
||||||
|
vec2 += 1;
|
||||||
|
vec3 += 1;
|
||||||
|
vec4 += 1;
|
||||||
|
vec5 += 1;
|
||||||
|
LOAD_INDEXED_DATA(src_ptr, vec2, tmp4);
|
||||||
|
LOAD_INDEXED_DATA(src_ptr, vec3, tmp5);
|
||||||
|
LOAD_INDEXED_DATA(src_ptr, vec4, tmp6);
|
||||||
|
LOAD_INDEXED_DATA(src_ptr, vec5, tmp7);
|
||||||
|
tmp4 -= tmp0;
|
||||||
|
tmp5 -= tmp1;
|
||||||
|
tmp6 -= tmp2;
|
||||||
|
tmp7 -= tmp3;
|
||||||
|
tmp4 *= vec6;
|
||||||
|
tmp5 *= vec7;
|
||||||
|
tmp6 *= vec8;
|
||||||
|
tmp7 *= vec9;
|
||||||
|
tmp4 += const_0x40;
|
||||||
|
tmp5 += const_0x40;
|
||||||
|
tmp6 += const_0x40;
|
||||||
|
tmp7 += const_0x40;
|
||||||
|
tmp4 >>= 7;
|
||||||
|
tmp5 >>= 7;
|
||||||
|
tmp6 >>= 7;
|
||||||
|
tmp7 >>= 7;
|
||||||
|
tmp0 += tmp4;
|
||||||
|
tmp1 += tmp5;
|
||||||
|
tmp2 += tmp6;
|
||||||
|
tmp3 += tmp7;
|
||||||
|
reg0 = (v8u16)__msa_pckev_h((v8i16)tmp1, (v8i16)tmp0);
|
||||||
|
reg1 = (v8u16)__msa_pckev_h((v8i16)tmp3, (v8i16)tmp2);
|
||||||
|
dst0 = (v16u8)__msa_pckev_b((v16i8)reg1, (v16i8)reg0);
|
||||||
|
__msa_st_b(dst0, dst_ptr, 0);
|
||||||
|
dst_ptr += 16;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ScaleARGBCols_MSA(uint8* dst_argb,
|
||||||
|
const uint8* src_argb,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx) {
|
||||||
|
const uint32* src = (const uint32*)(src_argb);
|
||||||
|
uint32* dst = (uint32*)(dst_argb);
|
||||||
|
int j;
|
||||||
|
v4i32 x_vec = __msa_fill_w(x);
|
||||||
|
v4i32 dx_vec = __msa_fill_w(dx);
|
||||||
|
v4i32 const_vec = {0, 1, 2, 3};
|
||||||
|
v4i32 vec0, vec1, vec2;
|
||||||
|
v4i32 dst0;
|
||||||
|
|
||||||
|
vec0 = dx_vec * const_vec;
|
||||||
|
vec1 = dx_vec * 4;
|
||||||
|
x_vec += vec0;
|
||||||
|
|
||||||
|
for (j = 0; j < dst_width; j += 4) {
|
||||||
|
vec2 = x_vec >> 16;
|
||||||
|
x_vec += vec1;
|
||||||
|
LOAD_INDEXED_DATA(src, vec2, dst0);
|
||||||
|
__msa_st_w(dst0, dst, 0);
|
||||||
|
dst += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef DISABLE_CLANG_MSA
|
||||||
|
void ScaleARGBFilterCols_MSA(uint8* dst_argb,
|
||||||
|
const uint8* src_argb,
|
||||||
|
int dst_width,
|
||||||
|
int x,
|
||||||
|
int dx) {
|
||||||
|
const uint32* src = (const uint32*)(src_argb);
|
||||||
|
int j;
|
||||||
|
v4u32 src0, src1, src2, src3;
|
||||||
|
v4u32 vec0, vec1, vec2, vec3;
|
||||||
|
v16u8 reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7;
|
||||||
|
v16u8 mult0, mult1, mult2, mult3;
|
||||||
|
v8u16 tmp0, tmp1, tmp2, tmp3;
|
||||||
|
v16u8 dst0, dst1;
|
||||||
|
v4u32 vec_x = (v4u32)__msa_fill_w(x);
|
||||||
|
v4u32 vec_dx = (v4u32)__msa_fill_w(dx);
|
||||||
|
v4u32 vec_const = {0, 1, 2, 3};
|
||||||
|
v16u8 const_0x7f = (v16u8)__msa_fill_b(0x7f);
|
||||||
|
|
||||||
|
vec0 = vec_dx * vec_const;
|
||||||
|
vec1 = vec_dx * 4;
|
||||||
|
vec_x += vec0;
|
||||||
|
|
||||||
|
for (j = 0; j < dst_width - 1; j += 8) {
|
||||||
|
vec2 = vec_x >> 16;
|
||||||
|
reg0 = (v16u8)(vec_x >> 9);
|
||||||
|
vec_x += vec1;
|
||||||
|
vec3 = vec_x >> 16;
|
||||||
|
reg1 = (v16u8)(vec_x >> 9);
|
||||||
|
vec_x += vec1;
|
||||||
|
reg0 = reg0 & const_0x7f;
|
||||||
|
reg1 = reg1 & const_0x7f;
|
||||||
|
reg0 = (v16u8)__msa_shf_b((v16i8)reg0, 0);
|
||||||
|
reg1 = (v16u8)__msa_shf_b((v16i8)reg1, 0);
|
||||||
|
reg2 = reg0 ^ const_0x7f;
|
||||||
|
reg3 = reg1 ^ const_0x7f;
|
||||||
|
mult0 = (v16u8)__msa_ilvr_b((v16i8)reg0, (v16i8)reg2);
|
||||||
|
mult1 = (v16u8)__msa_ilvl_b((v16i8)reg0, (v16i8)reg2);
|
||||||
|
mult2 = (v16u8)__msa_ilvr_b((v16i8)reg1, (v16i8)reg3);
|
||||||
|
mult3 = (v16u8)__msa_ilvl_b((v16i8)reg1, (v16i8)reg3);
|
||||||
|
LOAD_INDEXED_DATA(src, vec2, src0);
|
||||||
|
LOAD_INDEXED_DATA(src, vec3, src1);
|
||||||
|
vec2 += 1;
|
||||||
|
vec3 += 1;
|
||||||
|
LOAD_INDEXED_DATA(src, vec2, src2);
|
||||||
|
LOAD_INDEXED_DATA(src, vec3, src3);
|
||||||
|
reg4 = (v16u8)__msa_ilvr_b((v16i8)src2, (v16i8)src0);
|
||||||
|
reg5 = (v16u8)__msa_ilvl_b((v16i8)src2, (v16i8)src0);
|
||||||
|
reg6 = (v16u8)__msa_ilvr_b((v16i8)src3, (v16i8)src1);
|
||||||
|
reg7 = (v16u8)__msa_ilvl_b((v16i8)src3, (v16i8)src1);
|
||||||
|
tmp0 = __msa_dotp_u_h(reg4, mult0);
|
||||||
|
tmp1 = __msa_dotp_u_h(reg5, mult1);
|
||||||
|
tmp2 = __msa_dotp_u_h(reg6, mult2);
|
||||||
|
tmp3 = __msa_dotp_u_h(reg7, mult3);
|
||||||
|
tmp0 >>= 7;
|
||||||
|
tmp1 >>= 7;
|
||||||
|
tmp2 >>= 7;
|
||||||
|
tmp3 >>= 7;
|
||||||
|
dst0 = (v16u8)__msa_pckev_b((v16i8)tmp1, (v16i8)tmp0);
|
||||||
|
dst1 = (v16u8)__msa_pckev_b((v16i8)tmp3, (v16i8)tmp2);
|
||||||
|
__msa_st_b(dst0, dst_argb, 0);
|
||||||
|
__msa_st_b(dst1, dst_argb, 16);
|
||||||
|
dst_argb += 32;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ScaleRowDown34_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* dst,
|
||||||
|
int dst_width) {
|
||||||
|
int x;
|
||||||
|
(void)src_stride;
|
||||||
|
v16u8 src0, src1, src2, src3;
|
||||||
|
v16u8 vec0, vec1, vec2;
|
||||||
|
v16i8 mask0 = {0, 1, 3, 4, 5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19, 20};
|
||||||
|
v16i8 mask1 = {5, 7, 8, 9, 11, 12, 13, 15, 16, 17, 19, 20, 21, 23, 24, 25};
|
||||||
|
v16i8 mask2 = {11, 12, 13, 15, 16, 17, 19, 20,
|
||||||
|
21, 23, 24, 25, 27, 28, 29, 31};
|
||||||
|
|
||||||
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
|
|
||||||
|
for (x = 0; x < dst_width; x += 48) {
|
||||||
|
src0 = (v16u8)__msa_ld_b((v16i8*)src_ptr, 0);
|
||||||
|
src1 = (v16u8)__msa_ld_b((v16i8*)src_ptr, 16);
|
||||||
|
src2 = (v16u8)__msa_ld_b((v16i8*)src_ptr, 32);
|
||||||
|
src3 = (v16u8)__msa_ld_b((v16i8*)src_ptr, 48);
|
||||||
|
vec0 = (v16u8)__msa_vshf_b(mask0, (v16i8)src1, (v16i8)src0);
|
||||||
|
vec1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src2, (v16i8)src1);
|
||||||
|
vec2 = (v16u8)__msa_vshf_b(mask2, (v16i8)src3, (v16i8)src2);
|
||||||
|
__msa_st_b((v16i8)vec0, dst, 0);
|
||||||
|
__msa_st_b((v16i8)vec1, dst, 16);
|
||||||
|
__msa_st_b((v16i8)vec2, dst, 32);
|
||||||
|
src_ptr += 64;
|
||||||
|
dst += 48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScaleRowDown34_0_Box_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* d,
|
||||||
|
int dst_width) {
|
||||||
|
const uint8* s = src_ptr;
|
||||||
|
const uint8* t = src_ptr + src_stride;
|
||||||
|
int x;
|
||||||
|
v16u8 src0, src1, src2, src3, src4, src5, src6, src7, dst0, dst1, dst2;
|
||||||
|
v16u8 vec0, vec1, vec2, vec3, vec4, vec5;
|
||||||
|
v16u8 vec6, vec7, vec8, vec9, vec10, vec11;
|
||||||
|
v8i16 reg0, reg1, reg2, reg3, reg4, reg5;
|
||||||
|
v8i16 reg6, reg7, reg8, reg9, reg10, reg11;
|
||||||
|
v16u8 const0 = {3, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 1};
|
||||||
|
v16u8 const1 = {1, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 3, 3, 1};
|
||||||
|
v16u8 const2 = {1, 1, 1, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 3};
|
||||||
|
v16i8 mask0 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10};
|
||||||
|
v16i8 mask1 = {10, 11, 12, 13, 13, 14, 14, 15,
|
||||||
|
16, 17, 17, 18, 18, 19, 20, 21};
|
||||||
|
v16i8 mask2 = {5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 12, 13, 13, 14, 14, 15};
|
||||||
|
v8i16 shft0 = {2, 1, 2, 2, 1, 2, 2, 1};
|
||||||
|
v8i16 shft1 = {2, 2, 1, 2, 2, 1, 2, 2};
|
||||||
|
v8i16 shft2 = {1, 2, 2, 1, 2, 2, 1, 2};
|
||||||
|
|
||||||
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
|
|
||||||
|
for (x = 0; x < dst_width; x += 48) {
|
||||||
|
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);
|
||||||
|
vec0 = (v16u8)__msa_vshf_b(mask0, (v16i8)src0, (v16i8)src0);
|
||||||
|
vec1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0);
|
||||||
|
vec2 = (v16u8)__msa_vshf_b(mask2, (v16i8)src1, (v16i8)src1);
|
||||||
|
vec3 = (v16u8)__msa_vshf_b(mask0, (v16i8)src2, (v16i8)src2);
|
||||||
|
vec4 = (v16u8)__msa_vshf_b(mask1, (v16i8)src3, (v16i8)src2);
|
||||||
|
vec5 = (v16u8)__msa_vshf_b(mask2, (v16i8)src3, (v16i8)src3);
|
||||||
|
vec6 = (v16u8)__msa_vshf_b(mask0, (v16i8)src4, (v16i8)src4);
|
||||||
|
vec7 = (v16u8)__msa_vshf_b(mask1, (v16i8)src5, (v16i8)src4);
|
||||||
|
vec8 = (v16u8)__msa_vshf_b(mask2, (v16i8)src5, (v16i8)src5);
|
||||||
|
vec9 = (v16u8)__msa_vshf_b(mask0, (v16i8)src6, (v16i8)src6);
|
||||||
|
vec10 = (v16u8)__msa_vshf_b(mask1, (v16i8)src7, (v16i8)src6);
|
||||||
|
vec11 = (v16u8)__msa_vshf_b(mask2, (v16i8)src7, (v16i8)src7);
|
||||||
|
reg0 = (v8i16)__msa_dotp_u_h(vec0, const0);
|
||||||
|
reg1 = (v8i16)__msa_dotp_u_h(vec1, const1);
|
||||||
|
reg2 = (v8i16)__msa_dotp_u_h(vec2, const2);
|
||||||
|
reg3 = (v8i16)__msa_dotp_u_h(vec3, const0);
|
||||||
|
reg4 = (v8i16)__msa_dotp_u_h(vec4, const1);
|
||||||
|
reg5 = (v8i16)__msa_dotp_u_h(vec5, const2);
|
||||||
|
reg6 = (v8i16)__msa_dotp_u_h(vec6, const0);
|
||||||
|
reg7 = (v8i16)__msa_dotp_u_h(vec7, const1);
|
||||||
|
reg8 = (v8i16)__msa_dotp_u_h(vec8, const2);
|
||||||
|
reg9 = (v8i16)__msa_dotp_u_h(vec9, const0);
|
||||||
|
reg10 = (v8i16)__msa_dotp_u_h(vec10, const1);
|
||||||
|
reg11 = (v8i16)__msa_dotp_u_h(vec11, const2);
|
||||||
|
reg0 = __msa_srar_h(reg0, shft0);
|
||||||
|
reg1 = __msa_srar_h(reg1, shft1);
|
||||||
|
reg2 = __msa_srar_h(reg2, shft2);
|
||||||
|
reg3 = __msa_srar_h(reg3, shft0);
|
||||||
|
reg4 = __msa_srar_h(reg4, shft1);
|
||||||
|
reg5 = __msa_srar_h(reg5, shft2);
|
||||||
|
reg6 = __msa_srar_h(reg6, shft0);
|
||||||
|
reg7 = __msa_srar_h(reg7, shft1);
|
||||||
|
reg8 = __msa_srar_h(reg8, shft2);
|
||||||
|
reg9 = __msa_srar_h(reg9, shft0);
|
||||||
|
reg10 = __msa_srar_h(reg10, shft1);
|
||||||
|
reg11 = __msa_srar_h(reg11, shft2);
|
||||||
|
reg0 = reg0 * 3 + reg6;
|
||||||
|
reg1 = reg1 * 3 + reg7;
|
||||||
|
reg2 = reg2 * 3 + reg8;
|
||||||
|
reg3 = reg3 * 3 + reg9;
|
||||||
|
reg4 = reg4 * 3 + reg10;
|
||||||
|
reg5 = reg5 * 3 + reg11;
|
||||||
|
reg0 = __msa_srari_h(reg0, 2);
|
||||||
|
reg1 = __msa_srari_h(reg1, 2);
|
||||||
|
reg2 = __msa_srari_h(reg2, 2);
|
||||||
|
reg3 = __msa_srari_h(reg3, 2);
|
||||||
|
reg4 = __msa_srari_h(reg4, 2);
|
||||||
|
reg5 = __msa_srari_h(reg5, 2);
|
||||||
|
dst0 = (v16u8)__msa_pckev_b((v16i8)reg1, (v16i8)reg0);
|
||||||
|
dst1 = (v16u8)__msa_pckev_b((v16i8)reg3, (v16i8)reg2);
|
||||||
|
dst2 = (v16u8)__msa_pckev_b((v16i8)reg5, (v16i8)reg4);
|
||||||
|
__msa_st_b((v16i8)dst0, d, 0);
|
||||||
|
__msa_st_b((v16i8)dst1, d, 16);
|
||||||
|
__msa_st_b((v16i8)dst2, d, 32);
|
||||||
|
s += 64;
|
||||||
|
t += 64;
|
||||||
|
d += 48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ScaleRowDown34_1_Box_MSA(const uint8* src_ptr,
|
||||||
|
ptrdiff_t src_stride,
|
||||||
|
uint8* d,
|
||||||
|
int dst_width) {
|
||||||
|
const uint8* s = src_ptr;
|
||||||
|
const uint8* t = src_ptr + src_stride;
|
||||||
|
int x;
|
||||||
|
v16u8 src0, src1, src2, src3, src4, src5, src6, src7, dst0, dst1, dst2;
|
||||||
|
v16u8 vec0, vec1, vec2, vec3, vec4, vec5;
|
||||||
|
v16u8 vec6, vec7, vec8, vec9, vec10, vec11;
|
||||||
|
v8i16 reg0, reg1, reg2, reg3, reg4, reg5;
|
||||||
|
v8i16 reg6, reg7, reg8, reg9, reg10, reg11;
|
||||||
|
v16u8 const0 = {3, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 1};
|
||||||
|
v16u8 const1 = {1, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 3, 3, 1};
|
||||||
|
v16u8 const2 = {1, 1, 1, 3, 3, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, 3};
|
||||||
|
v16i8 mask0 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10};
|
||||||
|
v16i8 mask1 = {10, 11, 12, 13, 13, 14, 14, 15,
|
||||||
|
16, 17, 17, 18, 18, 19, 20, 21};
|
||||||
|
v16i8 mask2 = {5, 6, 6, 7, 8, 9, 9, 10, 10, 11, 12, 13, 13, 14, 14, 15};
|
||||||
|
v8i16 shft0 = {2, 1, 2, 2, 1, 2, 2, 1};
|
||||||
|
v8i16 shft1 = {2, 2, 1, 2, 2, 1, 2, 2};
|
||||||
|
v8i16 shft2 = {1, 2, 2, 1, 2, 2, 1, 2};
|
||||||
|
|
||||||
|
assert((dst_width % 3 == 0) && (dst_width > 0));
|
||||||
|
|
||||||
|
for (x = 0; x < dst_width; x += 48) {
|
||||||
|
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);
|
||||||
|
vec0 = (v16u8)__msa_vshf_b(mask0, (v16i8)src0, (v16i8)src0);
|
||||||
|
vec1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0);
|
||||||
|
vec2 = (v16u8)__msa_vshf_b(mask2, (v16i8)src1, (v16i8)src1);
|
||||||
|
vec3 = (v16u8)__msa_vshf_b(mask0, (v16i8)src2, (v16i8)src2);
|
||||||
|
vec4 = (v16u8)__msa_vshf_b(mask1, (v16i8)src3, (v16i8)src2);
|
||||||
|
vec5 = (v16u8)__msa_vshf_b(mask2, (v16i8)src3, (v16i8)src3);
|
||||||
|
vec6 = (v16u8)__msa_vshf_b(mask0, (v16i8)src4, (v16i8)src4);
|
||||||
|
vec7 = (v16u8)__msa_vshf_b(mask1, (v16i8)src5, (v16i8)src4);
|
||||||
|
vec8 = (v16u8)__msa_vshf_b(mask2, (v16i8)src5, (v16i8)src5);
|
||||||
|
vec9 = (v16u8)__msa_vshf_b(mask0, (v16i8)src6, (v16i8)src6);
|
||||||
|
vec10 = (v16u8)__msa_vshf_b(mask1, (v16i8)src7, (v16i8)src6);
|
||||||
|
vec11 = (v16u8)__msa_vshf_b(mask2, (v16i8)src7, (v16i8)src7);
|
||||||
|
reg0 = (v8i16)__msa_dotp_u_h(vec0, const0);
|
||||||
|
reg1 = (v8i16)__msa_dotp_u_h(vec1, const1);
|
||||||
|
reg2 = (v8i16)__msa_dotp_u_h(vec2, const2);
|
||||||
|
reg3 = (v8i16)__msa_dotp_u_h(vec3, const0);
|
||||||
|
reg4 = (v8i16)__msa_dotp_u_h(vec4, const1);
|
||||||
|
reg5 = (v8i16)__msa_dotp_u_h(vec5, const2);
|
||||||
|
reg6 = (v8i16)__msa_dotp_u_h(vec6, const0);
|
||||||
|
reg7 = (v8i16)__msa_dotp_u_h(vec7, const1);
|
||||||
|
reg8 = (v8i16)__msa_dotp_u_h(vec8, const2);
|
||||||
|
reg9 = (v8i16)__msa_dotp_u_h(vec9, const0);
|
||||||
|
reg10 = (v8i16)__msa_dotp_u_h(vec10, const1);
|
||||||
|
reg11 = (v8i16)__msa_dotp_u_h(vec11, const2);
|
||||||
|
reg0 = __msa_srar_h(reg0, shft0);
|
||||||
|
reg1 = __msa_srar_h(reg1, shft1);
|
||||||
|
reg2 = __msa_srar_h(reg2, shft2);
|
||||||
|
reg3 = __msa_srar_h(reg3, shft0);
|
||||||
|
reg4 = __msa_srar_h(reg4, shft1);
|
||||||
|
reg5 = __msa_srar_h(reg5, shft2);
|
||||||
|
reg6 = __msa_srar_h(reg6, shft0);
|
||||||
|
reg7 = __msa_srar_h(reg7, shft1);
|
||||||
|
reg8 = __msa_srar_h(reg8, shft2);
|
||||||
|
reg9 = __msa_srar_h(reg9, shft0);
|
||||||
|
reg10 = __msa_srar_h(reg10, shft1);
|
||||||
|
reg11 = __msa_srar_h(reg11, shft2);
|
||||||
|
reg0 += reg6;
|
||||||
|
reg1 += reg7;
|
||||||
|
reg2 += reg8;
|
||||||
|
reg3 += reg9;
|
||||||
|
reg4 += reg10;
|
||||||
|
reg5 += reg11;
|
||||||
|
reg0 = __msa_srari_h(reg0, 1);
|
||||||
|
reg1 = __msa_srari_h(reg1, 1);
|
||||||
|
reg2 = __msa_srari_h(reg2, 1);
|
||||||
|
reg3 = __msa_srari_h(reg3, 1);
|
||||||
|
reg4 = __msa_srari_h(reg4, 1);
|
||||||
|
reg5 = __msa_srari_h(reg5, 1);
|
||||||
|
dst0 = (v16u8)__msa_pckev_b((v16i8)reg1, (v16i8)reg0);
|
||||||
|
dst1 = (v16u8)__msa_pckev_b((v16i8)reg3, (v16i8)reg2);
|
||||||
|
dst2 = (v16u8)__msa_pckev_b((v16i8)reg5, (v16i8)reg4);
|
||||||
|
__msa_st_b((v16i8)dst0, d, 0);
|
||||||
|
__msa_st_b((v16i8)dst1, d, 16);
|
||||||
|
__msa_st_b((v16i8)dst2, d, 32);
|
||||||
|
s += 64;
|
||||||
|
t += 64;
|
||||||
|
d += 48;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
} // namespace libyuv
|
} // namespace libyuv
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user