[libyuv] Rewrite LoongArch LSX/LASX kernels in compact inline asm

Reduce loop unrolling across LoongArch LSX (128-bit) and LASX (256-bit)
compare, row, rotate, and scale kernels to match SSE2/SSSE3 and AVX2
(1-2 vectors per iteration), rewrite intrinsics/macro implementations
into GCC/Clang inline assembly, update all _Any wrapper masks and
IS_ALIGNED dispatch checks, and port all remaining LSX Convert (+19) and
Rotate (+2) kernels to LASX for full parity:

ISA              | Compare | Convert | Rotate  | Scale
-----------------|---------|---------|---------|--------
MIPS/Loong (Any) |    1    |    68   |    4    |   20
  LSX            |    1    |    68   |    4    |   20
  LASX           |    1    |    68   |    4    |    0

Removes 1,935 macro/helper lines from loongson_intrinsics.h (-99.3%) and
reduces total LoongArch compiled .text size by 9,799 bytes (-25.1%
overall, -37.4% row_lsx.cc, -52.3% scale_lsx.cc, -31.2% rotate_lsx.cc,
-4.9% row_lasx.cc while adding +25 LASX functions):

File               | Before   | After    | Change
-------------------|----------|----------|--------
scale_lsx.cc.o     | 6,055 B  | 2,888 B  | -52.3%
row_lsx.cc.o       | 17,252 B | 10,792 B | -37.4%
rotate_lsx.cc.o    | 1,488 B  | 1,024 B  | -31.2%
row_lasx.cc.o      | 13,740 B | 13,072 B |  -4.9%
rotate_lasx.cc.o   |   544 B  | 1,504 B  | +176.5%
TOTAL .text        | 39,079 B | 29,280 B | -25.1%

R=wtc@google.com, yuanhecai@loongson.cn

Test: qemu-loongarch64 -cpu la464 libyuv_unittest (LASX and LIBYUV_DISABLE_LASX=1)
Change-Id: I11c1143ad2aad0399f10b2c3fc9bc4c02c740c59
Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8564659
Reviewed-by: richard winterton <rrwinterton@gmail.com>
This commit is contained in:
Frank Barchard 2026-10-12 18:39:22 -07:00
parent ec29aca502
commit 2404f9730e
20 changed files with 7904 additions and 7663 deletions

File diff suppressed because it is too large Load Diff

View File

@ -93,13 +93,15 @@ extern "C" {
#endif
#if !defined(LIBYUV_DISABLE_LSX) && defined(__loongarch_sx)
#define HAS_TRANSPOSEWX16_LSX
#define HAS_TRANSPOSEUVWX16_LSX
#define HAS_TRANSPOSEWX8_LSX
#define HAS_TRANSPOSEUVWX8_LSX
#define HAS_TRANSPOSEWX8_16_LSX
#define HAS_TRANSPOSEWX4_32_LSX
#endif
#if !defined(LIBYUV_DISABLE_LASX) && defined(__loongarch_asx)
#define HAS_TRANSPOSEWX16_LASX
#define HAS_TRANSPOSEUVWX16_LASX
#define HAS_TRANSPOSEWX16_16_LASX
#define HAS_TRANSPOSEWX4_32_LASX
#endif
@ -167,7 +169,12 @@ void TransposeWx16_AVX512BW(const uint8_t* src,
uint8_t* dst,
int dst_stride,
int width);
void TransposeWx16_LSX(const uint8_t* src,
void TransposeWx8_LSX(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride,
int width);
void TransposeWx16_LASX(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride,
@ -203,7 +210,12 @@ void TransposeWx16_Any_AVX2(const uint8_t* src,
uint8_t* dst,
int dst_stride,
int width);
void TransposeWx16_Any_LSX(const uint8_t* src,
void TransposeWx8_Any_LSX(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride,
int width);
void TransposeWx16_Any_LASX(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride,
@ -278,7 +290,14 @@ void TransposeUVWxH_SME(const uint8_t* src,
int dst_stride_b,
int width,
int height);
void TransposeUVWx16_LSX(const uint8_t* src,
void TransposeUVWx8_LSX(const uint8_t* src,
int src_stride,
uint8_t* dst_a,
int dst_stride_a,
uint8_t* dst_b,
int dst_stride_b,
int width);
void TransposeUVWx16_LASX(const uint8_t* src,
int src_stride,
uint8_t* dst_a,
int dst_stride_a,
@ -321,7 +340,14 @@ void TransposeUVWx16_Any_AVX2(const uint8_t* src,
uint8_t* dst_b,
int dst_stride_b,
int width);
void TransposeUVWx16_Any_LSX(const uint8_t* src,
void TransposeUVWx8_Any_LSX(const uint8_t* src,
int src_stride,
uint8_t* dst_a,
int dst_stride_a,
uint8_t* dst_b,
int dst_stride_b,
int width);
void TransposeUVWx16_Any_LASX(const uint8_t* src,
int src_stride,
uint8_t* dst_a,
int dst_stride_a,

View File

@ -887,10 +887,15 @@ extern "C" {
#define HAS_ARGB4444TOARGBROW_LASX
#define HAS_ARGBADDROW_LASX
#define HAS_ARGBATTENUATEROW_LASX
#define HAS_ARGBBLENDROW_LASX
#define HAS_ARGBCOLORMATRIXROW_LASX
#define HAS_ARGBEXTRACTALPHAROW_LASX
#define HAS_ARGBGRAYROW_LASX
#define HAS_ARGBMIRRORROW_LASX
#define HAS_ARGBMULTIPLYROW_LASX
#define HAS_ARGBQUANTIZEROW_LASX
#define HAS_ARGBSEPIAROW_LASX
#define HAS_ARGBSETROW_LASX
#define HAS_ARGBSHADEROW_LASX
#define HAS_ARGBSHUFFLEROW_LASX
#define HAS_ARGBSUBTRACTROW_LASX
@ -902,6 +907,7 @@ extern "C" {
#define HAS_ARGBTORGB565ROW_LASX
#define HAS_ARGBTOYMATRIXROW_LASX
#define HAS_COPYROW_LASX
#define HAS_I400TOARGBROW_LASX
#define HAS_I422ALPHATOARGBROW_LASX
#define HAS_I422TOARGB1555ROW_LASX
#define HAS_I422TOARGB4444ROW_LASX
@ -911,7 +917,12 @@ extern "C" {
#define HAS_I422TORGBAROW_LASX
#define HAS_I422TOUYVYROW_LASX
#define HAS_I422TOYUY2ROW_LASX
#define HAS_I444TOARGBROW_LASX
#define HAS_INTERPOLATEROW_LASX
#define HAS_J400TOARGBROW_LASX
#define HAS_MERGEUVROW_LASX
#define HAS_MIRRORROW_LASX
#define HAS_MIRRORSPLITUVROW_LASX
#define HAS_MIRRORUVROW_LASX
#define HAS_NV12TOARGBROW_LASX
#define HAS_NV12TORGB565ROW_LASX
@ -921,13 +932,20 @@ extern "C" {
#define HAS_RAWTOUVROW_LASX
#define HAS_RGB24TOARGBROW_LASX
#define HAS_RGB24TOUVROW_LASX
#define HAS_RGBTOYMATRIXROW_LASX
#define HAS_RGB565TOARGBROW_LASX
#define HAS_RGB565TOUVROW_LASX
#define HAS_RGB565TOYROW_LASX
#define HAS_RGBTOYMATRIXROW_LASX
#define HAS_SETROW_LASX
#define HAS_SOBELROW_LASX
#define HAS_SOBELTOPLANEROW_LASX
#define HAS_SOBELXYROW_LASX
#define HAS_SPLITUVROW_LASX
#define HAS_UYVYTOARGBROW_LASX
#define HAS_UYVYTOUV422ROW_LASX
#define HAS_UYVYTOUVROW_LASX
#define HAS_UYVYTOYROW_LASX
#define HAS_YUY2TOARGBROW_LASX
#define HAS_YUY2TOUV422ROW_LASX
#define HAS_YUY2TOUVROW_LASX
#define HAS_YUY2TOYROW_LASX
@ -1725,6 +1743,12 @@ void I444ToARGBRow_LSX(const uint8_t* src_y,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void I444ToARGBRow_LASX(const uint8_t* src_y,
const uint8_t* src_u,
const uint8_t* src_v,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void I422ToARGBRow_LSX(const uint8_t* src_y,
const uint8_t* src_u,
@ -1847,10 +1871,18 @@ void YUY2ToARGBRow_LSX(const uint8_t* src_yuy2,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void YUY2ToARGBRow_LASX(const uint8_t* src_yuy2,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void UYVYToARGBRow_LSX(const uint8_t* src_uyvy,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void UYVYToARGBRow_LASX(const uint8_t* src_uyvy,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void NV12ToARGBRow_RVV(const uint8_t* src_y,
const uint8_t* src_uv,
uint8_t* dst_argb,
@ -2665,16 +2697,31 @@ void ABGRToUVRow_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ABGRToUVRow_Any_LASX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void BGRAToUVRow_Any_LSX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void BGRAToUVRow_Any_LASX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RGBAToUVRow_Any_LSX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void RGBAToUVRow_Any_LASX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void ARGB1555ToUVRow_Any_LSX(const uint8_t* src_ptr,
int src_stride_ptr,
uint8_t* dst_u,
@ -2825,6 +2872,10 @@ void MirrorSplitUVRow_LSX(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void MirrorSplitUVRow_LASX(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void MirrorSplitUVRow_C(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
@ -2901,6 +2952,10 @@ void SplitUVRow_LSX(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void SplitUVRow_LASX(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void SplitUVRow_RVV(const uint8_t* src_uv,
uint8_t* dst_u,
uint8_t* dst_v,
@ -2925,6 +2980,10 @@ void SplitUVRow_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void SplitUVRow_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_u,
uint8_t* dst_v,
int width);
void DetileRow_C(const uint8_t* src,
ptrdiff_t src_tile_stride,
uint8_t* dst,
@ -3070,6 +3129,10 @@ void MergeUVRow_LSX(const uint8_t* src_u,
const uint8_t* src_v,
uint8_t* dst_uv,
int width);
void MergeUVRow_LASX(const uint8_t* src_u,
const uint8_t* src_v,
uint8_t* dst_uv,
int width);
void MergeUVRow_RVV(const uint8_t* src_u,
const uint8_t* src_v,
uint8_t* dst_uv,
@ -3094,6 +3157,10 @@ void MergeUVRow_Any_LSX(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void MergeUVRow_Any_LASX(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void HalfMergeUVRow_C(const uint8_t* src_u,
int src_stride_u,
@ -4021,6 +4088,9 @@ void ARGBExtractAlphaRow_NEON(const uint8_t* src_argb,
void ARGBExtractAlphaRow_LSX(const uint8_t* src_argb,
uint8_t* dst_a,
int width);
void ARGBExtractAlphaRow_LASX(const uint8_t* src_argb,
uint8_t* dst_a,
int width);
void ARGBExtractAlphaRow_WASMSIMD(const uint8_t* src_argb,
uint8_t* dst_a,
int width);
@ -4039,6 +4109,9 @@ void ARGBExtractAlphaRow_Any_NEON(const uint8_t* src_ptr,
void ARGBExtractAlphaRow_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ARGBExtractAlphaRow_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void ARGBExtractAlphaRow_Any_WASMSIMD(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
@ -4068,16 +4141,20 @@ void SetRow_X86(uint8_t* dst, uint8_t v8, int width);
void SetRow_ERMS(uint8_t* dst, uint8_t v8, int width);
void SetRow_NEON(uint8_t* dst, uint8_t v8, int width);
void SetRow_LSX(uint8_t* dst, uint8_t v8, int width);
void SetRow_LASX(uint8_t* dst, uint8_t v8, int width);
void SetRow_Any_X86(uint8_t* dst_ptr, uint8_t v32, int width);
void SetRow_Any_NEON(uint8_t* dst_ptr, uint8_t v32, int width);
void SetRow_Any_LSX(uint8_t* dst_ptr, uint8_t v32, int width);
void SetRow_Any_LASX(uint8_t* dst_ptr, uint8_t v32, int width);
void ARGBSetRow_C(uint8_t* dst_argb, uint32_t v32, int width);
void ARGBSetRow_X86(uint8_t* dst_argb, uint32_t v32, int width);
void ARGBSetRow_NEON(uint8_t* dst, uint32_t v32, int width);
void ARGBSetRow_Any_NEON(uint8_t* dst_ptr, uint32_t v32, int width);
void ARGBSetRow_LSX(uint8_t* dst_argb, uint32_t v32, int width);
void ARGBSetRow_LASX(uint8_t* dst_argb, uint32_t v32, int width);
void ARGBSetRow_Any_LSX(uint8_t* dst_ptr, uint32_t v32, int width);
void ARGBSetRow_Any_LASX(uint8_t* dst_ptr, uint32_t v32, int width);
// ARGBShufflers for BGRAToARGB etc.
void ARGBShuffleRow_C(const uint8_t* src_argb,
@ -4520,6 +4597,7 @@ void J400ToARGBRow_AVX512BW(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_AVX2(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_LSX(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_LASX(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_RVV(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_C(const uint8_t* src_y, uint8_t* dst_argb, int width);
void J400ToARGBRow_Any_AVX512BW(const uint8_t* src_ptr,
@ -4532,6 +4610,9 @@ void J400ToARGBRow_Any_NEON(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void J400ToARGBRow_Any_LSX(const uint8_t* src_ptr, uint8_t* dst_ptr, int width);
void J400ToARGBRow_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
int width);
void I444ToARGBRow_C(const uint8_t* src_y,
const uint8_t* src_u,
@ -5513,6 +5594,10 @@ void I400ToARGBRow_LSX(const uint8_t* src_y,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void I400ToARGBRow_LASX(const uint8_t* src_y,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
int width);
void I400ToARGBRow_RVV(const uint8_t* src_y,
uint8_t* dst_argb,
const struct YuvConstants* yuvconstants,
@ -5533,6 +5618,10 @@ void I400ToARGBRow_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
const struct YuvConstants* yuvconstants,
int width);
void I400ToARGBRow_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
const struct YuvConstants* yuvconstants,
int width);
// ARGB preattenuated alpha blend.
void ARGBBlendRow_SSSE3(const uint8_t* src_argb,
@ -5551,10 +5640,18 @@ void ARGBBlendRow_LSX(const uint8_t* src_argb0,
const uint8_t* src_argb1,
uint8_t* dst_argb,
int width);
void ARGBBlendRow_LASX(const uint8_t* src_argb0,
const uint8_t* src_argb1,
uint8_t* dst_argb,
int width);
void ARGBBlendRow_Any_LSX(const uint8_t* src_argb0,
const uint8_t* src_argb1,
uint8_t* dst_argb,
int width);
void ARGBBlendRow_Any_LASX(const uint8_t* src_argb0,
const uint8_t* src_argb1,
uint8_t* dst_argb,
int width);
void ARGBBlendRow_RVV(const uint8_t* src_argb0,
const uint8_t* src_argb1,
uint8_t* dst_argb,
@ -6103,6 +6200,12 @@ void I444ToARGBRow_Any_LSX(const uint8_t* y_buf,
uint8_t* dst_ptr,
const struct YuvConstants* yuvconstants,
int width);
void I444ToARGBRow_Any_LASX(const uint8_t* y_buf,
const uint8_t* u_buf,
const uint8_t* v_buf,
uint8_t* dst_ptr,
const struct YuvConstants* yuvconstants,
int width);
void I422ToARGBRow_Any_LSX(const uint8_t* y_buf,
const uint8_t* u_buf,
const uint8_t* v_buf,
@ -6224,10 +6327,18 @@ void YUY2ToARGBRow_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
const struct YuvConstants* yuvconstants,
int width);
void YUY2ToARGBRow_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
const struct YuvConstants* yuvconstants,
int width);
void UYVYToARGBRow_Any_LSX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
const struct YuvConstants* yuvconstants,
int width);
void UYVYToARGBRow_Any_LASX(const uint8_t* src_ptr,
uint8_t* dst_ptr,
const struct YuvConstants* yuvconstants,
int width);
void YUY2ToYRow_AVX2(const uint8_t* src_yuy2, uint8_t* dst_y, int width);
void YUY2ToUVRow_AVX2(const uint8_t* src_yuy2,
@ -6769,6 +6880,10 @@ void ARGBColorMatrixRow_LSX(const uint8_t* src_argb,
uint8_t* dst_argb,
const int8_t* matrix_argb,
int width);
void ARGBColorMatrixRow_LASX(const uint8_t* src_argb,
uint8_t* dst_argb,
const int8_t* matrix_argb,
int width);
void ARGBColorTableRow_C(uint8_t* dst_argb,
const uint8_t* table_argb,
@ -6804,6 +6919,11 @@ void ARGBQuantizeRow_LSX(uint8_t* dst_argb,
int interval_size,
int interval_offset,
int width);
void ARGBQuantizeRow_LASX(uint8_t* dst_argb,
int scale,
int interval_size,
int interval_offset,
int width);
void ARGBShadeRow_C(const uint8_t* src_argb,
uint8_t* dst_argb,
@ -6918,6 +7038,11 @@ void InterpolateRow_LSX(uint8_t* dst_ptr,
ptrdiff_t src_stride,
int width,
int source_y_fraction);
void InterpolateRow_LASX(uint8_t* dst_ptr,
const uint8_t* src_ptr,
ptrdiff_t src_stride,
int width,
int source_y_fraction);
void InterpolateRow_RVV(uint8_t* dst_ptr,
const uint8_t* src_ptr,
ptrdiff_t src_stride,
@ -6938,6 +7063,11 @@ void InterpolateRow_Any_LSX(uint8_t* dst_ptr,
ptrdiff_t src_stride_ptr,
int width,
int source_y_fraction);
void InterpolateRow_Any_LASX(uint8_t* dst_ptr,
const uint8_t* src_ptr,
ptrdiff_t src_stride_ptr,
int width,
int source_y_fraction);
void InterpolateRow_16_C(uint16_t* dst_ptr,
const uint16_t* src_ptr,
@ -7019,6 +7149,10 @@ void SobelRow_LSX(const uint8_t* src_sobelx,
const uint8_t* src_sobely,
uint8_t* dst_argb,
int width);
void SobelRow_LASX(const uint8_t* src_sobelx,
const uint8_t* src_sobely,
uint8_t* dst_argb,
int width);
void SobelToPlaneRow_C(const uint8_t* src_sobelx,
const uint8_t* src_sobely,
uint8_t* dst_y,
@ -7035,6 +7169,10 @@ void SobelToPlaneRow_LSX(const uint8_t* src_sobelx,
const uint8_t* src_sobely,
uint8_t* dst_y,
int width);
void SobelToPlaneRow_LASX(const uint8_t* src_sobelx,
const uint8_t* src_sobely,
uint8_t* dst_y,
int width);
void SobelXYRow_C(const uint8_t* src_sobelx,
const uint8_t* src_sobely,
uint8_t* dst_argb,
@ -7051,6 +7189,10 @@ void SobelXYRow_LSX(const uint8_t* src_sobelx,
const uint8_t* src_sobely,
uint8_t* dst_argb,
int width);
void SobelXYRow_LASX(const uint8_t* src_sobelx,
const uint8_t* src_sobely,
uint8_t* dst_argb,
int width);
void SobelRow_Any_SSE2(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
@ -7063,6 +7205,10 @@ void SobelRow_Any_LSX(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void SobelRow_Any_LASX(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void SobelToPlaneRow_Any_SSE2(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
@ -7075,6 +7221,10 @@ void SobelToPlaneRow_Any_LSX(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void SobelToPlaneRow_Any_LASX(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void SobelXYRow_Any_SSE2(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
@ -7087,6 +7237,10 @@ void SobelXYRow_Any_LSX(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void SobelXYRow_Any_LASX(const uint8_t* y_buf,
const uint8_t* uv_buf,
uint8_t* dst_ptr,
int width);
void ARGBPolynomialRow_C(const uint8_t* src_argb,
uint8_t* dst_argb,
@ -7147,10 +7301,18 @@ void HalfFloatRow_LSX(const uint16_t* src,
uint16_t* dst,
float scale,
int width);
void HalfFloatRow_LASX(const uint16_t* src,
uint16_t* dst,
float scale,
int width);
void HalfFloatRow_Any_LSX(const uint16_t* src_ptr,
uint16_t* dst_ptr,
float param,
int width);
void HalfFloatRow_Any_LASX(const uint16_t* src_ptr,
uint16_t* dst_ptr,
float param,
int width);
void ByteToFloatRow_C(const uint8_t* src, float* dst, float scale, int width);
void ByteToFloatRow_NEON(const uint8_t* src,
float* dst,

View File

@ -997,6 +997,14 @@ int I010ToNV12(const uint16_t* src_y,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -1496,6 +1504,14 @@ int I422ToNV21(const uint8_t* src_y,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -1543,11 +1559,19 @@ int I422ToNV21(const uint8_t* src_y,
#if defined(HAS_INTERPOLATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
InterpolateRow = InterpolateRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
InterpolateRow = InterpolateRow_LSX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;
@ -2085,11 +2109,19 @@ static int Px10ToI420(const uint16_t* src_y,
#if defined(HAS_SPLITUVROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
SplitUVRow = SplitUVRow_Any_LSX;
if (IS_ALIGNED(src_uv_width, 32)) {
if (IS_ALIGNED(src_uv_width, 16)) {
SplitUVRow = SplitUVRow_LSX;
}
}
#endif
#if defined(HAS_SPLITUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
SplitUVRow = SplitUVRow_Any_LASX;
if (IS_ALIGNED(src_uv_width, 32)) {
SplitUVRow = SplitUVRow_LASX;
}
}
#endif
#if defined(HAS_SPLITUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
SplitUVRow = SplitUVRow_RVV;
@ -2564,16 +2596,6 @@ int UYVYToI420(const uint8_t* src_uyvy,
}
}
#endif
#if defined(HAS_UYVYTOYROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
UYVYToYRow = UYVYToYRow_Any_LSX;
UYVYToUVRow = UYVYToUVRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
UYVYToYRow = UYVYToYRow_LSX;
UYVYToUVRow = UYVYToUVRow_LSX;
}
}
#endif
#if defined(HAS_UYVYTOYROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
UYVYToYRow = UYVYToYRow_Any_LASX;
@ -2863,7 +2885,7 @@ int ARGBToI420Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -2871,7 +2893,7 @@ int ARGBToI420Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -3095,7 +3117,7 @@ int ARGBToI420Alpha(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -3103,7 +3125,7 @@ int ARGBToI420Alpha(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -3212,10 +3234,16 @@ int ARGBToI420Alpha(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBEXTRACTALPHAROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBExtractAlphaRow = IS_ALIGNED(width, 16) ? ARGBExtractAlphaRow_LSX
ARGBExtractAlphaRow = IS_ALIGNED(width, 8) ? ARGBExtractAlphaRow_LSX
: ARGBExtractAlphaRow_Any_LSX;
}
#endif
#if defined(HAS_ARGBEXTRACTALPHAROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBExtractAlphaRow = IS_ALIGNED(width, 16) ? ARGBExtractAlphaRow_LASX
: ARGBExtractAlphaRow_Any_LASX;
}
#endif
#if defined(HAS_ARGBEXTRACTALPHAROW_WASMSIMD)
if (TestCpuFlag(kCpuHasWASMSIMD)) {
ARGBExtractAlphaRow = IS_ALIGNED(width, 16)
@ -3443,7 +3471,7 @@ static int AR30ToI420Matrix(const uint8_t* src_ar30,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -3451,7 +3479,7 @@ static int AR30ToI420Matrix(const uint8_t* src_ar30,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -3688,6 +3716,22 @@ int RGB24ToI420(const uint8_t* src_rgb24,
}
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
RGBToYMatrixRow = RGBToYMatrixRow_LSX;
}
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
RGBToYMatrixRow = RGBToYMatrixRow_LASX;
}
}
#endif
#if defined(HAS_RGBTOUVMATRIXROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
RGBToUVMatrixRow = RGBToUVMatrixRow_RVV;
@ -3833,6 +3877,22 @@ int RGB24ToJ420(const uint8_t* src_rgb24,
}
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
RGBToYMatrixRow = RGBToYMatrixRow_LSX;
}
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
RGBToYMatrixRow = RGBToYMatrixRow_LASX;
}
}
#endif
#if defined(HAS_RGBTOUVMATRIXROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
RGBToUVMatrixRow = RGBToUVMatrixRow_RVV;
@ -3983,6 +4043,22 @@ int RAWToI420(const uint8_t* src_raw,
}
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
RGBToYMatrixRow = RGBToYMatrixRow_LSX;
}
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
RGBToYMatrixRow = RGBToYMatrixRow_LASX;
}
}
#endif
#if defined(HAS_RGBTOUVMATRIXROW_WASMSIMD)
if (TestCpuFlag(kCpuHasWASMSIMD)) {
RGBToUVMatrixRow = RGBToUVMatrixRow_Any_WASMSIMD;
@ -4118,6 +4194,22 @@ int RAWToJ420(const uint8_t* src_raw,
}
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
RGBToYMatrixRow = RGBToYMatrixRow_LSX;
}
}
#endif
#if defined(HAS_RGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
RGBToYMatrixRow = RGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
RGBToYMatrixRow = RGBToYMatrixRow_LASX;
}
}
#endif
#if defined(HAS_RGBTOUVMATRIXROW_WASMSIMD)
if (TestCpuFlag(kCpuHasWASMSIMD)) {
RGBToUVMatrixRow = RGBToUVMatrixRow_Any_WASMSIMD;

View File

@ -123,7 +123,7 @@ int I420ToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_I422TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToARGBRow = I422ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToARGBRow = I422ToARGBRow_LSX;
}
}
@ -131,7 +131,7 @@ int I420ToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_I422TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToARGBRow = I422ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToARGBRow = I422ToARGBRow_LASX;
}
}
@ -386,7 +386,7 @@ int I422ToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_I422TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToARGBRow = I422ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToARGBRow = I422ToARGBRow_LSX;
}
}
@ -394,7 +394,7 @@ int I422ToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_I422TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToARGBRow = I422ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToARGBRow = I422ToARGBRow_LASX;
}
}
@ -648,11 +648,19 @@ int I444ToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_I444TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I444ToARGBRow = I444ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I444ToARGBRow = I444ToARGBRow_LSX;
}
}
#endif
#if defined(HAS_I444TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I444ToARGBRow = I444ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
I444ToARGBRow = I444ToARGBRow_LASX;
}
}
#endif
#if defined(HAS_I444TOARGBROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
I444ToARGBRow = I444ToARGBRow_RVV;
@ -2463,7 +2471,7 @@ int I420AlphaToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_I422ALPHATOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422AlphaToARGBRow = I422AlphaToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422AlphaToARGBRow = I422AlphaToARGBRow_LSX;
}
}
@ -2518,7 +2526,7 @@ int I420AlphaToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -2526,7 +2534,7 @@ int I420AlphaToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -2635,7 +2643,7 @@ int I422AlphaToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_I422ALPHATOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422AlphaToARGBRow = I422AlphaToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422AlphaToARGBRow = I422AlphaToARGBRow_LSX;
}
}
@ -2690,7 +2698,7 @@ int I422AlphaToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -2698,7 +2706,7 @@ int I422AlphaToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -2839,7 +2847,7 @@ int I444AlphaToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -2847,7 +2855,7 @@ int I444AlphaToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -3103,7 +3111,7 @@ int I010AlphaToARGBMatrix(const uint16_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -3111,7 +3119,7 @@ int I010AlphaToARGBMatrix(const uint16_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -3240,7 +3248,7 @@ int I210AlphaToARGBMatrix(const uint16_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -3248,7 +3256,7 @@ int I210AlphaToARGBMatrix(const uint16_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -3375,7 +3383,7 @@ int I410AlphaToARGBMatrix(const uint16_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -3383,7 +3391,7 @@ int I410AlphaToARGBMatrix(const uint16_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -3476,11 +3484,19 @@ int I400ToARGBMatrix(const uint8_t* src_y,
#if defined(HAS_I400TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I400ToARGBRow = I400ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I400ToARGBRow = I400ToARGBRow_LSX;
}
}
#endif
#if defined(HAS_I400TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I400ToARGBRow = I400ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
I400ToARGBRow = I400ToARGBRow_LASX;
}
}
#endif
#if defined(HAS_I400TOARGBROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
I400ToARGBRow = I400ToARGBRow_RVV;
@ -3562,11 +3578,19 @@ int J400ToARGB(const uint8_t* src_y,
#if defined(HAS_J400TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
J400ToARGBRow = J400ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
J400ToARGBRow = J400ToARGBRow_LSX;
}
}
#endif
#if defined(HAS_J400TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
J400ToARGBRow = J400ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
J400ToARGBRow = J400ToARGBRow_LASX;
}
}
#endif
#if defined(HAS_J400TOARGBROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
J400ToARGBRow = J400ToARGBRow_RVV;
@ -4188,7 +4212,7 @@ int RGB565ToARGB(const uint8_t* src_rgb565,
#if defined(HAS_RGB565TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
RGB565ToARGBRow = RGB565ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
RGB565ToARGBRow = RGB565ToARGBRow_LSX;
}
}
@ -4196,7 +4220,7 @@ int RGB565ToARGB(const uint8_t* src_rgb565,
#if defined(HAS_RGB565TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
RGB565ToARGBRow = RGB565ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
RGB565ToARGBRow = RGB565ToARGBRow_LASX;
}
}
@ -4271,7 +4295,7 @@ int ARGB1555ToARGB(const uint8_t* src_argb1555,
#if defined(HAS_ARGB1555TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGB1555ToARGBRow = ARGB1555ToARGBRow_LSX;
}
}
@ -4279,7 +4303,7 @@ int ARGB1555ToARGB(const uint8_t* src_argb1555,
#if defined(HAS_ARGB1555TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGB1555ToARGBRow = ARGB1555ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGB1555ToARGBRow = ARGB1555ToARGBRow_LASX;
}
}
@ -4349,7 +4373,7 @@ int ARGB4444ToARGB(const uint8_t* src_argb4444,
#if defined(HAS_ARGB4444TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGB4444ToARGBRow = ARGB4444ToARGBRow_LSX;
}
}
@ -4357,7 +4381,7 @@ int ARGB4444ToARGB(const uint8_t* src_argb4444,
#if defined(HAS_ARGB4444TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGB4444ToARGBRow = ARGB4444ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGB4444ToARGBRow = ARGB4444ToARGBRow_LASX;
}
}
@ -5255,6 +5279,14 @@ int YUY2ToARGBMatrix(const uint8_t* src_yuy2,
YUY2ToARGBRow = YUY2ToARGBRow_LSX;
}
}
#endif
#if defined(HAS_YUY2TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
YUY2ToARGBRow = YUY2ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
YUY2ToARGBRow = YUY2ToARGBRow_LASX;
}
}
#endif
for (y = 0; y < height; ++y) {
YUY2ToARGBRow(src_yuy2, dst_argb, yuvconstants, width);
@ -5347,6 +5379,14 @@ int UYVYToARGBMatrix(const uint8_t* src_uyvy,
UYVYToARGBRow = UYVYToARGBRow_LSX;
}
}
#endif
#if defined(HAS_UYVYTOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
UYVYToARGBRow = UYVYToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
UYVYToARGBRow = UYVYToARGBRow_LASX;
}
}
#endif
for (y = 0; y < height; ++y) {
UYVYToARGBRow(src_uyvy, dst_argb, yuvconstants, width);
@ -5565,7 +5605,7 @@ int I422ToRGBAMatrix(const uint8_t* src_y,
#if defined(HAS_I422TORGBAROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToRGBARow = I422ToRGBARow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToRGBARow = I422ToRGBARow_LSX;
}
}
@ -5573,7 +5613,7 @@ int I422ToRGBAMatrix(const uint8_t* src_y,
#if defined(HAS_I422TORGBAROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToRGBARow = I422ToRGBARow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToRGBARow = I422ToRGBARow_LASX;
}
}
@ -5797,7 +5837,7 @@ int I420ToRGBAMatrix(const uint8_t* src_y,
#if defined(HAS_I422TORGBAROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToRGBARow = I422ToRGBARow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToRGBARow = I422ToRGBARow_LSX;
}
}
@ -5805,7 +5845,7 @@ int I420ToRGBAMatrix(const uint8_t* src_y,
#if defined(HAS_I422TORGBAROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToRGBARow = I422ToRGBARow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToRGBARow = I422ToRGBARow_LASX;
}
}
@ -5940,7 +5980,7 @@ int I420ToRGB24Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB24ROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToRGB24Row = I422ToRGB24Row_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToRGB24Row = I422ToRGB24Row_LSX;
}
}
@ -5948,7 +5988,7 @@ int I420ToRGB24Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB24ROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToRGB24Row = I422ToRGB24Row_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToRGB24Row = I422ToRGB24Row_LASX;
}
}
@ -6171,7 +6211,7 @@ int I422ToRGB24Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB24ROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToRGB24Row = I422ToRGB24Row_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToRGB24Row = I422ToRGB24Row_LSX;
}
}
@ -6179,7 +6219,7 @@ int I422ToRGB24Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB24ROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToRGB24Row = I422ToRGB24Row_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToRGB24Row = I422ToRGB24Row_LASX;
}
}
@ -6308,7 +6348,7 @@ int I420ToARGB1555(const uint8_t* src_y,
#if defined(HAS_I422TOARGB1555ROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToARGB1555Row = I422ToARGB1555Row_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToARGB1555Row = I422ToARGB1555Row_LSX;
}
}
@ -6316,7 +6356,7 @@ int I420ToARGB1555(const uint8_t* src_y,
#if defined(HAS_I422TOARGB1555ROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToARGB1555Row = I422ToARGB1555Row_Any_LASX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 16)) {
I422ToARGB1555Row = I422ToARGB1555Row_LASX;
}
}
@ -6407,7 +6447,7 @@ int I420ToARGB4444(const uint8_t* src_y,
#if defined(HAS_I422TOARGB4444ROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToARGB4444Row = I422ToARGB4444Row_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToARGB4444Row = I422ToARGB4444Row_LSX;
}
}
@ -6415,7 +6455,7 @@ int I420ToARGB4444(const uint8_t* src_y,
#if defined(HAS_I422TOARGB4444ROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToARGB4444Row = I422ToARGB4444Row_Any_LASX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 16)) {
I422ToARGB4444Row = I422ToARGB4444Row_LASX;
}
}
@ -6508,7 +6548,7 @@ int I420ToRGB565Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB565ROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToRGB565Row = I422ToRGB565Row_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToRGB565Row = I422ToRGB565Row_LSX;
}
}
@ -6516,7 +6556,7 @@ int I420ToRGB565Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB565ROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToRGB565Row = I422ToRGB565Row_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToRGB565Row = I422ToRGB565Row_LASX;
}
}
@ -6667,7 +6707,7 @@ int I422ToRGB565Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB565ROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToRGB565Row = I422ToRGB565Row_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToRGB565Row = I422ToRGB565Row_LSX;
}
}
@ -6675,7 +6715,7 @@ int I422ToRGB565Matrix(const uint8_t* src_y,
#if defined(HAS_I422TORGB565ROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToRGB565Row = I422ToRGB565Row_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToRGB565Row = I422ToRGB565Row_LASX;
}
}
@ -6800,7 +6840,7 @@ int I420ToRGB565Dither(const uint8_t* src_y,
#if defined(HAS_I422TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I422ToARGBRow = I422ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
I422ToARGBRow = I422ToARGBRow_LSX;
}
}
@ -6808,7 +6848,7 @@ int I420ToRGB565Dither(const uint8_t* src_y,
#if defined(HAS_I422TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I422ToARGBRow = I422ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I422ToARGBRow = I422ToARGBRow_LASX;
}
}
@ -6858,7 +6898,7 @@ int I420ToRGB565Dither(const uint8_t* src_y,
#if defined(HAS_ARGBTORGB565DITHERROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_LSX;
}
}
@ -6866,7 +6906,7 @@ int I420ToRGB565Dither(const uint8_t* src_y,
#if defined(HAS_ARGBTORGB565DITHERROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_LASX;
}
}
@ -7138,10 +7178,18 @@ static int I420ToARGBMatrixBilinear(const uint8_t* src_y,
I444ToARGBRow = I444ToARGBRow_SME;
}
#endif
#if defined(HAS_I444TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I444ToARGBRow = I444ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
I444ToARGBRow = I444ToARGBRow_LSX;
}
}
#endif
#if defined(HAS_I444TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I444ToARGBRow = I444ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I444ToARGBRow = I444ToARGBRow_LASX;
}
}
@ -7296,10 +7344,18 @@ static int I422ToARGBMatrixLinear(const uint8_t* src_y,
I444ToARGBRow = I444ToARGBRow_SME;
}
#endif
#if defined(HAS_I444TOARGBROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
I444ToARGBRow = I444ToARGBRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
I444ToARGBRow = I444ToARGBRow_LSX;
}
}
#endif
#if defined(HAS_I444TOARGBROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
I444ToARGBRow = I444ToARGBRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
I444ToARGBRow = I444ToARGBRow_LASX;
}
}
@ -8091,7 +8147,7 @@ static int I420AlphaToARGBMatrixBilinear(
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -8099,7 +8155,7 @@ static int I420AlphaToARGBMatrixBilinear(
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -8316,7 +8372,7 @@ static int I422AlphaToARGBMatrixLinear(const uint8_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -8324,7 +8380,7 @@ static int I422AlphaToARGBMatrixLinear(const uint8_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -8493,7 +8549,7 @@ static int I010AlphaToARGBMatrixBilinear(
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -8501,7 +8557,7 @@ static int I010AlphaToARGBMatrixBilinear(
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -8692,7 +8748,7 @@ static int I210AlphaToARGBMatrixLinear(const uint16_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -8700,7 +8756,7 @@ static int I210AlphaToARGBMatrixLinear(const uint16_t* src_y,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}

View File

@ -113,7 +113,7 @@ int ARGBToI444Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -121,7 +121,7 @@ int ARGBToI444Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -305,7 +305,7 @@ int ARGBToI422Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -313,7 +313,7 @@ int ARGBToI422Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -504,7 +504,7 @@ int ARGBToNV12Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -512,7 +512,7 @@ int ARGBToNV12Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -657,6 +657,14 @@ int ARGBToNV12Matrix(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -783,7 +791,7 @@ int ARGBToNV16Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -791,7 +799,7 @@ int ARGBToNV16Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -936,6 +944,14 @@ int ARGBToNV16Matrix(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -1056,7 +1072,7 @@ int ARGBToNV24Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -1064,7 +1080,7 @@ int ARGBToNV24Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -1198,6 +1214,14 @@ int ARGBToNV24Matrix(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -1306,7 +1330,7 @@ int ARGBToNV21Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -1314,7 +1338,7 @@ int ARGBToNV21Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -1459,6 +1483,14 @@ int ARGBToNV21Matrix(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -2018,7 +2050,7 @@ int ARGBToP010Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -2026,7 +2058,7 @@ int ARGBToP010Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -2257,6 +2289,14 @@ int ARGBToP010Matrix(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -2416,7 +2456,7 @@ int ARGBToP210Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -2424,7 +2464,7 @@ int ARGBToP210Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -2655,6 +2695,14 @@ int ARGBToP210Matrix(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -2799,7 +2847,7 @@ int ARGBToP410Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -2807,7 +2855,7 @@ int ARGBToP410Matrix(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -3027,6 +3075,14 @@ int ARGBToP410Matrix(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -3439,7 +3495,7 @@ int ARGBToRGB565Dither(const uint8_t* src_argb,
#if defined(HAS_ARGBTORGB565DITHERROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_LSX;
}
}
@ -3447,7 +3503,7 @@ int ARGBToRGB565Dither(const uint8_t* src_argb,
#if defined(HAS_ARGBTORGB565DITHERROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToRGB565DitherRow = ARGBToRGB565DitherRow_LASX;
}
}
@ -3527,7 +3583,6 @@ int ARGBToRGB565(const uint8_t* src_argb,
}
}
#endif
#if defined(HAS_ARGBTORGB565ROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToRGB565Row = ARGBToRGB565Row_Any_LASX;
@ -4278,6 +4333,14 @@ static int RAWToNVMatrix(const uint8_t* src_raw,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(halfwidth, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;

View File

@ -97,12 +97,12 @@ void CopyPlane(const uint8_t* src_y,
#endif
#if defined(HAS_COPYROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
CopyRow = IS_ALIGNED(width, 32) ? CopyRow_LSX : CopyRow_Any_LSX;
CopyRow = IS_ALIGNED(width, 16) ? CopyRow_LSX : CopyRow_Any_LSX;
}
#endif
#if defined(HAS_COPYROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
CopyRow = IS_ALIGNED(width, 64) ? CopyRow_LASX : CopyRow_Any_LASX;
CopyRow = IS_ALIGNED(width, 32) ? CopyRow_LASX : CopyRow_Any_LASX;
}
#endif
@ -700,11 +700,19 @@ void SplitUVPlane(const uint8_t* src_uv,
#if defined(HAS_SPLITUVROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
SplitUVRow = SplitUVRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
SplitUVRow = SplitUVRow_LSX;
}
}
#endif
#if defined(HAS_SPLITUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
SplitUVRow = SplitUVRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
SplitUVRow = SplitUVRow_LASX;
}
}
#endif
#if defined(HAS_SPLITUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
SplitUVRow = SplitUVRow_RVV;
@ -798,6 +806,14 @@ void MergeUVPlane(const uint8_t* src_u,
}
}
#endif
#if defined(HAS_MERGEUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MergeUVRow = MergeUVRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
MergeUVRow = MergeUVRow_LASX;
}
}
#endif
#if defined(HAS_MERGEUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
MergeUVRow = MergeUVRow_RVV;
@ -2676,6 +2692,14 @@ int UYVYToY(const uint8_t* src_uyvy,
}
}
#endif
#if defined(HAS_UYVYTOYROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
UYVYToYRow = UYVYToYRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
UYVYToYRow = UYVYToYRow_LASX;
}
}
#endif
for (y = 0; y < height; ++y) {
UYVYToYRow(src_uyvy, dst_y, width);
@ -2740,7 +2764,7 @@ void MirrorPlane(const uint8_t* src_y,
#if defined(HAS_MIRRORROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
MirrorRow = MirrorRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
MirrorRow = MirrorRow_LSX;
}
}
@ -2748,7 +2772,7 @@ void MirrorPlane(const uint8_t* src_y,
#if defined(HAS_MIRRORROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MirrorRow = MirrorRow_Any_LASX;
if (IS_ALIGNED(width, 64)) {
if (IS_ALIGNED(width, 32)) {
MirrorRow = MirrorRow_LASX;
}
}
@ -3128,7 +3152,7 @@ int ARGBMirror(const uint8_t* src_argb,
#if defined(HAS_ARGBMIRRORROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBMirrorRow = ARGBMirrorRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBMirrorRow = ARGBMirrorRow_LSX;
}
}
@ -3136,7 +3160,7 @@ int ARGBMirror(const uint8_t* src_argb,
#if defined(HAS_ARGBMIRRORROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBMirrorRow = ARGBMirrorRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBMirrorRow = ARGBMirrorRow_LASX;
}
}
@ -3272,11 +3296,19 @@ int ARGBBlend(const uint8_t* src_argb0,
#if defined(HAS_ARGBBLENDROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBBlendRow = ARGBBlendRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBBlendRow = ARGBBlendRow_LSX;
}
}
#endif
#if defined(HAS_ARGBBLENDROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBBlendRow = ARGBBlendRow_Any_LASX;
if (IS_ALIGNED(width, 8)) {
ARGBBlendRow = ARGBBlendRow_LASX;
}
}
#endif
#if defined(HAS_ARGBBLENDROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
ARGBBlendRow = ARGBBlendRow_RVV;
@ -3991,6 +4023,14 @@ void SetPlane(uint8_t* dst_y,
}
}
#endif
#if defined(HAS_SETROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
SetRow = SetRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
SetRow = SetRow_LASX;
}
}
#endif
// Set plane
for (y = 0; y < height; ++y) {
@ -4082,6 +4122,14 @@ int ARGBRect(uint8_t* dst_argb,
}
}
#endif
#if defined(HAS_ARGBSETROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBSetRow = ARGBSetRow_Any_LASX;
if (IS_ALIGNED(width, 8)) {
ARGBSetRow = ARGBSetRow_LASX;
}
}
#endif
// Set plane
for (y = 0; y < height; ++y) {
@ -4162,7 +4210,7 @@ int ARGBAttenuate(const uint8_t* src_argb,
#if defined(HAS_ARGBATTENUATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBAttenuateRow = ARGBAttenuateRow_LSX;
}
}
@ -4170,7 +4218,7 @@ int ARGBAttenuate(const uint8_t* src_argb,
#if defined(HAS_ARGBATTENUATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBAttenuateRow = ARGBAttenuateRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBAttenuateRow = ARGBAttenuateRow_LASX;
}
}
@ -4466,9 +4514,14 @@ int ARGBColorMatrix(const uint8_t* src_argb,
}
#endif
#if defined(HAS_ARGBCOLORMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX) && IS_ALIGNED(width, 8)) {
if (TestCpuFlag(kCpuHasLSX) && IS_ALIGNED(width, 4)) {
ARGBColorMatrixRow = ARGBColorMatrixRow_LSX;
}
#endif
#if defined(HAS_ARGBCOLORMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX) && IS_ALIGNED(width, 8)) {
ARGBColorMatrixRow = ARGBColorMatrixRow_LASX;
}
#endif
for (y = 0; y < height; ++y) {
ARGBColorMatrixRow(src_argb, dst_argb, matrix_argb, width);
@ -4631,9 +4684,14 @@ int ARGBQuantize(uint8_t* dst_argb,
}
#endif
#if defined(HAS_ARGBQUANTIZEROW_LSX)
if (TestCpuFlag(kCpuHasLSX) && IS_ALIGNED(width, 8)) {
if (TestCpuFlag(kCpuHasLSX) && IS_ALIGNED(width, 4)) {
ARGBQuantizeRow = ARGBQuantizeRow_LSX;
}
#endif
#if defined(HAS_ARGBQUANTIZEROW_LASX)
if (TestCpuFlag(kCpuHasLASX) && IS_ALIGNED(width, 8)) {
ARGBQuantizeRow = ARGBQuantizeRow_LASX;
}
#endif
for (y = 0; y < height; ++y) {
ARGBQuantizeRow(dst, scale, interval_size, interval_offset, width);
@ -4934,11 +4992,19 @@ int InterpolatePlane(const uint8_t* src0,
#if defined(HAS_INTERPOLATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
InterpolateRow = InterpolateRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
InterpolateRow = InterpolateRow_LSX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;
@ -5172,7 +5238,7 @@ int ARGBShuffle(const uint8_t* src_argb,
#if defined(HAS_ARGBSHUFFLEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBShuffleRow = ARGBShuffleRow_Any_LSX;
if (IS_ALIGNED(width, 8)) {
if (IS_ALIGNED(width, 4)) {
ARGBShuffleRow = ARGBShuffleRow_LSX;
}
}
@ -5180,7 +5246,7 @@ int ARGBShuffle(const uint8_t* src_argb,
#if defined(HAS_ARGBSHUFFLEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBShuffleRow = ARGBShuffleRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBShuffleRow = ARGBShuffleRow_LASX;
}
}
@ -5434,7 +5500,7 @@ static int ARGBSobelize(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LSX;
}
}
@ -5442,7 +5508,7 @@ static int ARGBSobelize(const uint8_t* src_argb,
#if defined(HAS_ARGBTOYMATRIXROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
ARGBToYMatrixRow = ARGBToYMatrixRow_LASX;
}
}
@ -5560,10 +5626,18 @@ int ARGBSobel(const uint8_t* src_argb,
#if defined(HAS_SOBELROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
SobelRow = SobelRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
SobelRow = SobelRow_LSX;
}
}
#endif
#if defined(HAS_SOBELROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
SobelRow = SobelRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
SobelRow = SobelRow_LASX;
}
}
#endif
return ARGBSobelize(src_argb, src_stride_argb, dst_argb, dst_stride_argb,
width, height, SobelRow);
@ -5598,10 +5672,18 @@ int ARGBSobelToPlane(const uint8_t* src_argb,
#if defined(HAS_SOBELTOPLANEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
SobelToPlaneRow = SobelToPlaneRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
SobelToPlaneRow = SobelToPlaneRow_LSX;
}
}
#endif
#if defined(HAS_SOBELTOPLANEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
SobelToPlaneRow = SobelToPlaneRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
SobelToPlaneRow = SobelToPlaneRow_LASX;
}
}
#endif
return ARGBSobelize(src_argb, src_stride_argb, dst_y, dst_stride_y, width,
height, SobelToPlaneRow);
@ -5637,10 +5719,18 @@ int ARGBSobelXY(const uint8_t* src_argb,
#if defined(HAS_SOBELXYROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
SobelXYRow = SobelXYRow_Any_LSX;
if (IS_ALIGNED(width, 16)) {
if (IS_ALIGNED(width, 8)) {
SobelXYRow = SobelXYRow_LSX;
}
}
#endif
#if defined(HAS_SOBELXYROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
SobelXYRow = SobelXYRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
SobelXYRow = SobelXYRow_LASX;
}
}
#endif
return ARGBSobelize(src_argb, src_stride_argb, dst_argb, dst_stride_argb,
width, height, SobelXYRow);
@ -5767,11 +5857,19 @@ int HalfFloatPlane(const uint16_t* src_y,
#if defined(HAS_HALFFLOATROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
HalfFloatRow = HalfFloatRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 8)) {
HalfFloatRow = HalfFloatRow_LSX;
}
}
#endif
#if defined(HAS_HALFFLOATROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
HalfFloatRow = HalfFloatRow_Any_LASX;
if (IS_ALIGNED(width, 16)) {
HalfFloatRow = HalfFloatRow_LASX;
}
}
#endif
for (y = 0; y < height; ++y) {
HalfFloatRow(src_y, dst_y, scale, width);
@ -5950,10 +6048,16 @@ int ARGBExtractAlpha(const uint8_t* src_argb,
#endif
#if defined(HAS_ARGBEXTRACTALPHAROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ARGBExtractAlphaRow = IS_ALIGNED(width, 16) ? ARGBExtractAlphaRow_LSX
ARGBExtractAlphaRow = IS_ALIGNED(width, 8) ? ARGBExtractAlphaRow_LSX
: ARGBExtractAlphaRow_Any_LSX;
}
#endif
#if defined(HAS_ARGBEXTRACTALPHAROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
ARGBExtractAlphaRow = IS_ALIGNED(width, 16) ? ARGBExtractAlphaRow_LASX
: ARGBExtractAlphaRow_Any_LASX;
}
#endif
#if defined(HAS_ARGBEXTRACTALPHAROW_WASMSIMD)
if (TestCpuFlag(kCpuHasWASMSIMD)) {
ARGBExtractAlphaRow = IS_ALIGNED(width, 16)
@ -6229,11 +6333,19 @@ int UYVYToNV12(const uint8_t* src_uyvy,
#if defined(HAS_SPLITUVROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
SplitUVRow = SplitUVRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
SplitUVRow = SplitUVRow_LSX;
}
}
#endif
#if defined(HAS_SPLITUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
SplitUVRow = SplitUVRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
SplitUVRow = SplitUVRow_LASX;
}
}
#endif
#if defined(HAS_SPLITUVROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
SplitUVRow = SplitUVRow_RVV;
@ -6274,11 +6386,19 @@ int UYVYToNV12(const uint8_t* src_uyvy,
#if defined(HAS_INTERPOLATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
InterpolateRow = InterpolateRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
InterpolateRow = InterpolateRow_LSX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(width, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;

View File

@ -37,14 +37,14 @@ void TransposePlane(const uint8_t* src,
int dst_stride, int width, int height) = NULL;
#endif
#if defined(HAS_TRANSPOSEWX16_AVX2) || defined(HAS_TRANSPOSEWX16_AVX512BW) || \
defined(HAS_TRANSPOSEWX16_WASMSIMD)
defined(HAS_TRANSPOSEWX16_LASX) || defined(HAS_TRANSPOSEWX16_WASMSIMD)
void (*TransposeWx16)(const uint8_t* src, int src_stride, uint8_t* dst,
int dst_stride, int width) = NULL;
#elif defined(HAS_TRANSPOSEWX16_LSX) || defined(HAS_TRANSPOSEWX16_NEON)
#elif defined(HAS_TRANSPOSEWX16_NEON)
void (*TransposeWx16)(const uint8_t* src, int src_stride, uint8_t* dst,
int dst_stride, int width) = TransposeWx16_C;
#endif
#if !defined(HAS_TRANSPOSEWX16_LSX) && !defined(HAS_TRANSPOSEWX16_NEON)
#if !defined(HAS_TRANSPOSEWX16_NEON)
void (*TransposeWx8)(const uint8_t* src, int src_stride, uint8_t* dst,
int dst_stride, int width) = TransposeWx8_C;
#endif
@ -91,11 +91,19 @@ void TransposePlane(const uint8_t* src,
TransposeWx16 = TransposeWx16_AVX512BW;
}
#endif
#if defined(HAS_TRANSPOSEWX16_LSX)
#if defined(HAS_TRANSPOSEWX8_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
TransposeWx16 = TransposeWx16_Any_LSX;
TransposeWx8 = TransposeWx8_Any_LSX;
if (IS_ALIGNED(width, 16)) {
TransposeWx16 = TransposeWx16_LSX;
TransposeWx8 = TransposeWx8_LSX;
}
}
#endif
#if defined(HAS_TRANSPOSEWX16_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
TransposeWx16 = TransposeWx16_Any_LASX;
if (IS_ALIGNED(width, 16)) {
TransposeWx16 = TransposeWx16_LASX;
}
}
#endif
@ -123,7 +131,7 @@ void TransposePlane(const uint8_t* src,
}
#endif
#if defined(HAS_TRANSPOSEWX16_AVX2) || defined(HAS_TRANSPOSEWX16_AVX512BW) || \
defined(HAS_TRANSPOSEWX16_LSX) || defined(HAS_TRANSPOSEWX16_NEON) || \
defined(HAS_TRANSPOSEWX16_LASX) || defined(HAS_TRANSPOSEWX16_NEON) || \
defined(HAS_TRANSPOSEWX16_WASMSIMD)
// Work across the source in 16x16 tiles
if (TransposeWx16) {
@ -135,7 +143,7 @@ void TransposePlane(const uint8_t* src,
}
}
#endif
#if !defined(HAS_TRANSPOSEWX16_LSX) && !defined(HAS_TRANSPOSEWX16_NEON)
#if !defined(HAS_TRANSPOSEWX16_NEON)
// Work across the source in 8x8 tiles
while (i >= 8) {
TransposeWx8(src, src_stride, dst, dst_stride, width);
@ -233,7 +241,7 @@ void RotatePlane180(const uint8_t* src,
#if defined(HAS_MIRRORROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
MirrorRow = MirrorRow_Any_LSX;
if (IS_ALIGNED(width, 32)) {
if (IS_ALIGNED(width, 16)) {
MirrorRow = MirrorRow_LSX;
}
}
@ -241,7 +249,7 @@ void RotatePlane180(const uint8_t* src,
#if defined(HAS_MIRRORROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
MirrorRow = MirrorRow_Any_LASX;
if (IS_ALIGNED(width, 64)) {
if (IS_ALIGNED(width, 32)) {
MirrorRow = MirrorRow_LASX;
}
}
@ -296,12 +304,12 @@ void RotatePlane180(const uint8_t* src,
#endif
#if defined(HAS_COPYROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
CopyRow = IS_ALIGNED(width, 32) ? CopyRow_LSX : CopyRow_Any_LSX;
CopyRow = IS_ALIGNED(width, 16) ? CopyRow_LSX : CopyRow_Any_LSX;
}
#endif
#if defined(HAS_COPYROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
CopyRow = IS_ALIGNED(width, 64) ? CopyRow_LASX : CopyRow_Any_LASX;
CopyRow = IS_ALIGNED(width, 32) ? CopyRow_LASX : CopyRow_Any_LASX;
}
#endif
@ -335,26 +343,28 @@ void SplitTransposeUV(const uint8_t* src,
#endif
#if defined(HAS_TRANSPOSEUVWX16_AVX2) || \
defined(HAS_TRANSPOSEUVWX16_AVX512BW) || \
defined(HAS_TRANSPOSEUVWX16_WASMSIMD)
defined(HAS_TRANSPOSEUVWX16_LASX) || defined(HAS_TRANSPOSEUVWX16_WASMSIMD)
void (*TransposeUVWx16)(const uint8_t* src, int src_stride, uint8_t* dst_a,
int dst_stride_a, uint8_t* dst_b, int dst_stride_b,
int width) = NULL;
#elif defined(HAS_TRANSPOSEUVWX16_LSX)
void (*TransposeUVWx16)(const uint8_t* src, int src_stride, uint8_t* dst_a,
int dst_stride_a, uint8_t* dst_b, int dst_stride_b,
int width) = TransposeUVWx16_C;
#endif
#if !defined(HAS_TRANSPOSEUVWX16_LSX)
void (*TransposeUVWx8)(const uint8_t* src, int src_stride, uint8_t* dst_a,
int dst_stride_a, uint8_t* dst_b, int dst_stride_b,
int width) = TransposeUVWx8_C;
#endif
#if defined(HAS_TRANSPOSEUVWX16_LSX)
#if defined(HAS_TRANSPOSEUVWX8_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
TransposeUVWx16 = TransposeUVWx16_Any_LSX;
TransposeUVWx8 = TransposeUVWx8_Any_LSX;
if (IS_ALIGNED(width, 8)) {
TransposeUVWx16 = TransposeUVWx16_LSX;
TransposeUVWx8 = TransposeUVWx8_LSX;
}
}
#endif
#if defined(HAS_TRANSPOSEUVWX16_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
TransposeUVWx16 = TransposeUVWx16_Any_LASX;
if (IS_ALIGNED(width, 8)) {
TransposeUVWx16 = TransposeUVWx16_LASX;
}
}
#endif
@ -418,7 +428,7 @@ void SplitTransposeUV(const uint8_t* src,
#endif
#if defined(HAS_TRANSPOSEUVWX16_AVX2) || \
defined(HAS_TRANSPOSEUVWX16_AVX512BW) || \
defined(HAS_TRANSPOSEUVWX16_LSX) || defined(HAS_TRANSPOSEUVWX16_WASMSIMD)
defined(HAS_TRANSPOSEUVWX16_LASX) || defined(HAS_TRANSPOSEUVWX16_WASMSIMD)
// Work through the source in 16x16 tiles.
if (TransposeUVWx16) {
while (i >= 16) {
@ -431,7 +441,6 @@ void SplitTransposeUV(const uint8_t* src,
}
}
#endif
#if !defined(HAS_TRANSPOSEUVWX16_LSX)
// Work through the source in 8x8 tiles.
while (i >= 8) {
TransposeUVWx8(src, src_stride, dst_a, dst_stride_a, dst_b, dst_stride_b,
@ -441,7 +450,6 @@ void SplitTransposeUV(const uint8_t* src,
dst_b += 8; // Move over 8 columns.
i -= 8;
}
#endif
if (i > 0) {
TransposeUVWxH_C(src, src_stride, dst_a, dst_stride_a, dst_b, dst_stride_b,
@ -512,10 +520,15 @@ void SplitRotateUV180(const uint8_t* src,
}
#endif
#if defined(HAS_MIRRORSPLITUVROW_LSX)
if (TestCpuFlag(kCpuHasLSX) && IS_ALIGNED(width, 32)) {
if (TestCpuFlag(kCpuHasLSX) && IS_ALIGNED(width, 16)) {
MirrorSplitUVRow = MirrorSplitUVRow_LSX;
}
#endif
#if defined(HAS_MIRRORSPLITUVROW_LASX)
if (TestCpuFlag(kCpuHasLASX) && IS_ALIGNED(width, 32)) {
MirrorSplitUVRow = MirrorSplitUVRow_LASX;
}
#endif
#if defined(HAS_MIRRORSPLITUVROW_WASMSIMD)
if (TestCpuFlag(kCpuHasWASMSIMD) && IS_ALIGNED(width, 16)) {
MirrorSplitUVRow = MirrorSplitUVRow_WASMSIMD;

View File

@ -40,8 +40,11 @@ TANY(TransposeWx8_Any_SSSE3, TransposeWx8_SSSE3, TransposeWx8_C, 15)
#ifdef HAS_TRANSPOSEWX16_AVX2
TANY(TransposeWx16_Any_AVX2, TransposeWx16_AVX2, TransposeWx16_C, 15)
#endif
#ifdef HAS_TRANSPOSEWX16_LSX
TANY(TransposeWx16_Any_LSX, TransposeWx16_LSX, TransposeWx16_C, 15)
#ifdef HAS_TRANSPOSEWX8_LSX
TANY(TransposeWx8_Any_LSX, TransposeWx8_LSX, TransposeWx8_C, 15)
#endif
#ifdef HAS_TRANSPOSEWX16_LASX
TANY(TransposeWx16_Any_LASX, TransposeWx16_LASX, TransposeWx16_C, 15)
#endif
#ifdef HAS_TRANSPOSEWX8_WASMSIMD
TANY(TransposeWx8_Any_WASMSIMD, TransposeWx8_WASMSIMD, TransposeWx8_C, 15)
@ -74,8 +77,11 @@ TUVANY(TransposeUVWx8_Any_SSE2, TransposeUVWx8_SSE2, TransposeUVWx8_C, 7)
#ifdef HAS_TRANSPOSEUVWX16_AVX2
TUVANY(TransposeUVWx16_Any_AVX2, TransposeUVWx16_AVX2, TransposeUVWx16_C, 7)
#endif
#ifdef HAS_TRANSPOSEUVWX16_LSX
TUVANY(TransposeUVWx16_Any_LSX, TransposeUVWx16_LSX, TransposeUVWx16_C, 7)
#ifdef HAS_TRANSPOSEUVWX8_LSX
TUVANY(TransposeUVWx8_Any_LSX, TransposeUVWx8_LSX, TransposeUVWx8_C, 7)
#endif
#ifdef HAS_TRANSPOSEUVWX16_LASX
TUVANY(TransposeUVWx16_Any_LASX, TransposeUVWx16_LASX, TransposeUVWx16_C, 7)
#endif
#ifdef HAS_TRANSPOSEUVWX8_WASMSIMD
TUVANY(TransposeUVWx8_Any_WASMSIMD,

View File

@ -11,15 +11,307 @@
#include "libyuv/rotate_row.h"
#if !defined(LIBYUV_DISABLE_LASX) && defined(__loongarch_asx)
#include "libyuv/loongson_intrinsics.h"
#ifdef __cplusplus
namespace libyuv {
extern "C" {
#endif
// Transpose 32 bit values (ARGB) in 2x 4x4 tiles per step (4 cols x 8 rows ->
// 8 cols x 4 rows). Width is a multiple of 8.
void TransposeWx16_LASX(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride,
int width) {
const ptrdiff_t s = src_stride;
const ptrdiff_t d = dst_stride;
const uint8_t* t;
asm volatile(
"srli.w %[w], %[w], 4 \n"
"beqz %[w], 2f \n"
"1: \n"
"move %[t], %[src] \n"
"vld $vr0, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr1, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr2, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr3, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr4, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr5, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr6, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr7, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr8, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr9, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr10, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr11, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr12, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr13, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr14, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr15, %[t], 0 \n"
"addi.d %[src], %[src], 16 \n"
"xvpermi.q $xr0, $xr8, 0x02 \n"
"xvpermi.q $xr1, $xr9, 0x02 \n"
"xvpermi.q $xr2, $xr10, 0x02 \n"
"xvpermi.q $xr3, $xr11, 0x02 \n"
"xvpermi.q $xr4, $xr12, 0x02 \n"
"xvpermi.q $xr5, $xr13, 0x02 \n"
"xvpermi.q $xr6, $xr14, 0x02 \n"
"xvpermi.q $xr7, $xr15, 0x02 \n"
"xvilvl.b $xr8, $xr1, $xr0 \n"
"xvilvh.b $xr9, $xr1, $xr0 \n"
"xvilvl.b $xr10, $xr3, $xr2 \n"
"xvilvh.b $xr11, $xr3, $xr2 \n"
"xvilvl.b $xr12, $xr5, $xr4 \n"
"xvilvh.b $xr13, $xr5, $xr4 \n"
"xvilvl.b $xr14, $xr7, $xr6 \n"
"xvilvh.b $xr15, $xr7, $xr6 \n"
"xvilvl.h $xr0, $xr10, $xr8 \n"
"xvilvh.h $xr1, $xr10, $xr8 \n"
"xvilvl.h $xr2, $xr11, $xr9 \n"
"xvilvh.h $xr3, $xr11, $xr9 \n"
"xvilvl.h $xr4, $xr14, $xr12 \n"
"xvilvh.h $xr5, $xr14, $xr12 \n"
"xvilvl.h $xr6, $xr15, $xr13 \n"
"xvilvh.h $xr7, $xr15, $xr13 \n"
"xvilvl.w $xr8, $xr4, $xr0 \n"
"xvilvh.w $xr9, $xr4, $xr0 \n"
"xvilvl.w $xr10, $xr5, $xr1 \n"
"xvilvh.w $xr11, $xr5, $xr1 \n"
"xvilvl.w $xr12, $xr6, $xr2 \n"
"xvilvh.w $xr13, $xr6, $xr2 \n"
"xvilvl.w $xr14, $xr7, $xr3 \n"
"xvilvh.w $xr15, $xr7, $xr3 \n"
"xvpermi.d $xr0, $xr8, 0x08 \n"
"xvpermi.d $xr1, $xr8, 0x0d \n"
"xvpermi.d $xr2, $xr9, 0x08 \n"
"xvpermi.d $xr3, $xr9, 0x0d \n"
"xvpermi.d $xr4, $xr10, 0x08 \n"
"xvpermi.d $xr5, $xr10, 0x0d \n"
"xvpermi.d $xr6, $xr11, 0x08 \n"
"xvpermi.d $xr7, $xr11, 0x0d \n"
"xvpermi.d $xr8, $xr12, 0x08 \n"
"xvpermi.d $xr9, $xr12, 0x0d \n"
"xvpermi.d $xr10, $xr13, 0x08 \n"
"xvpermi.d $xr11, $xr13, 0x0d \n"
"xvpermi.d $xr12, $xr14, 0x08 \n"
"xvpermi.d $xr13, $xr14, 0x0d \n"
"xvpermi.d $xr14, $xr15, 0x08 \n"
"xvpermi.d $xr15, $xr15, 0x0d \n"
"vst $vr0, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr1, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr2, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr3, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr4, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr5, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr6, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr7, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr8, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr9, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr10, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr11, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr12, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr13, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr14, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr15, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"addi.w %[w], %[w], -1 \n"
"bnez %[w], 1b \n"
"2: \n"
: [src] "+r"(src), // %[src]
[dst] "+r"(dst), // %[dst]
[w] "+r"(width), // %[w]
[t] "=&r"(t) // %[t]
: [s] "r"(s), // %[s]
[d] "r"(d) // %[d]
: "memory", "$xr0", "$xr1", "$xr2", "$xr3", "$xr4", "$xr5", "$xr6",
"$xr7", "$xr8", "$xr9", "$xr10", "$xr11", "$xr12", "$xr13", "$xr14",
"$xr15");
}
void TransposeUVWx16_LASX(const uint8_t* src,
int src_stride,
uint8_t* dst_a,
int dst_stride_a,
uint8_t* dst_b,
int dst_stride_b,
int width) {
const ptrdiff_t s = src_stride;
const ptrdiff_t da = dst_stride_a;
const ptrdiff_t db = dst_stride_b;
const uint8_t* t;
asm volatile(
"srli.w %[w], %[w], 3 \n"
"beqz %[w], 2f \n"
"1: \n"
"move %[t], %[src] \n"
"vld $vr0, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr1, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr2, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr3, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr4, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr5, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr6, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr7, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr8, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr9, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr10, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr11, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr12, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr13, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr14, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr15, %[t], 0 \n"
"addi.d %[src], %[src], 16 \n"
"xvpermi.q $xr0, $xr8, 0x02 \n"
"xvpermi.q $xr1, $xr9, 0x02 \n"
"xvpermi.q $xr2, $xr10, 0x02 \n"
"xvpermi.q $xr3, $xr11, 0x02 \n"
"xvpermi.q $xr4, $xr12, 0x02 \n"
"xvpermi.q $xr5, $xr13, 0x02 \n"
"xvpermi.q $xr6, $xr14, 0x02 \n"
"xvpermi.q $xr7, $xr15, 0x02 \n"
"xvilvl.b $xr8, $xr1, $xr0 \n"
"xvilvh.b $xr9, $xr1, $xr0 \n"
"xvilvl.b $xr10, $xr3, $xr2 \n"
"xvilvh.b $xr11, $xr3, $xr2 \n"
"xvilvl.b $xr12, $xr5, $xr4 \n"
"xvilvh.b $xr13, $xr5, $xr4 \n"
"xvilvl.b $xr14, $xr7, $xr6 \n"
"xvilvh.b $xr15, $xr7, $xr6 \n"
"xvilvl.h $xr0, $xr10, $xr8 \n"
"xvilvh.h $xr1, $xr10, $xr8 \n"
"xvilvl.h $xr2, $xr11, $xr9 \n"
"xvilvh.h $xr3, $xr11, $xr9 \n"
"xvilvl.h $xr4, $xr14, $xr12 \n"
"xvilvh.h $xr5, $xr14, $xr12 \n"
"xvilvl.h $xr6, $xr15, $xr13 \n"
"xvilvh.h $xr7, $xr15, $xr13 \n"
"xvilvl.w $xr8, $xr4, $xr0 \n"
"xvilvh.w $xr9, $xr4, $xr0 \n"
"xvilvl.w $xr10, $xr5, $xr1 \n"
"xvilvh.w $xr11, $xr5, $xr1 \n"
"xvilvl.w $xr12, $xr6, $xr2 \n"
"xvilvh.w $xr13, $xr6, $xr2 \n"
"xvilvl.w $xr14, $xr7, $xr3 \n"
"xvilvh.w $xr15, $xr7, $xr3 \n"
"xvpermi.d $xr0, $xr8, 0x08 \n"
"xvpermi.d $xr1, $xr8, 0x0d \n"
"xvpermi.d $xr2, $xr9, 0x08 \n"
"xvpermi.d $xr3, $xr9, 0x0d \n"
"xvpermi.d $xr4, $xr10, 0x08 \n"
"xvpermi.d $xr5, $xr10, 0x0d \n"
"xvpermi.d $xr6, $xr11, 0x08 \n"
"xvpermi.d $xr7, $xr11, 0x0d \n"
"xvpermi.d $xr8, $xr12, 0x08 \n"
"xvpermi.d $xr9, $xr12, 0x0d \n"
"xvpermi.d $xr10, $xr13, 0x08 \n"
"xvpermi.d $xr11, $xr13, 0x0d \n"
"xvpermi.d $xr12, $xr14, 0x08 \n"
"xvpermi.d $xr13, $xr14, 0x0d \n"
"xvpermi.d $xr14, $xr15, 0x08 \n"
"xvpermi.d $xr15, $xr15, 0x0d \n"
"vst $vr0, %[dst_a], 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vst $vr1, %[dst_b], 0 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vst $vr2, %[dst_a], 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vst $vr3, %[dst_b], 0 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vst $vr4, %[dst_a], 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vst $vr5, %[dst_b], 0 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vst $vr6, %[dst_a], 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vst $vr7, %[dst_b], 0 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vst $vr8, %[dst_a], 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vst $vr9, %[dst_b], 0 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vst $vr10, %[dst_a], 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vst $vr11, %[dst_b], 0 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vst $vr12, %[dst_a], 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vst $vr13, %[dst_b], 0 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vst $vr14, %[dst_a], 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vst $vr15, %[dst_b], 0 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"addi.w %[w], %[w], -1 \n"
"bnez %[w], 1b \n"
"2: \n"
: [src] "+r"(src), // %[src]
[dst_a] "+r"(dst_a), // %[dst_a]
[dst_b] "+r"(dst_b), // %[dst_b]
[w] "+r"(width), // %[w]
[t] "=&r"(t) // %[t]
: [s] "r"(s), // %[s]
[da] "r"(da), // %[da]
[db] "r"(db) // %[db]
: "memory", "$xr0", "$xr1", "$xr2", "$xr3", "$xr4", "$xr5", "$xr6",
"$xr7", "$xr8", "$xr9", "$xr10", "$xr11", "$xr12", "$xr13", "$xr14",
"$xr15");
}
void TransposeWx4_32_LASX(const uint8_t* src,
int src_stride,
uint8_t* dst,
@ -50,25 +342,21 @@ void TransposeWx4_32_LASX(const uint8_t* src,
"vldx $vr7, %[src4], %[s3] \n"
"add.d %[src], %[src4], %[s4] \n"
// Combine rows (0,4), (1,5), (2,6), (3,7) into 256-bit xr0..xr3
"xvpermi.q $xr0, $xr4, 0x02 \n"
"xvpermi.q $xr1, $xr5, 0x02 \n"
"xvpermi.q $xr2, $xr6, 0x02 \n"
"xvpermi.q $xr3, $xr7, 0x02 \n"
// Transpose 2x2 across both 128-bit lanes
"xvilvl.w $xr4, $xr1, $xr0 \n"
"xvilvh.w $xr5, $xr1, $xr0 \n"
"xvilvl.w $xr6, $xr3, $xr2 \n"
"xvilvh.w $xr7, $xr3, $xr2 \n"
// Transpose 4x4 across both 128-bit lanes
"xvilvl.d $xr0, $xr6, $xr4 \n"
"xvilvh.d $xr1, $xr6, $xr4 \n"
"xvilvl.d $xr2, $xr7, $xr5 \n"
"xvilvh.d $xr3, $xr7, $xr5 \n"
// Store 4 full 256-bit (32-byte) destination rows
"xvst $xr0, %[dst0], 0 \n"
"xvst $xr1, %[dst1], 0 \n"
"xvst $xr2, %[dst2], 0 \n"

View File

@ -1,8 +1,6 @@
/*
* Copyright 2022 The LibYuv Project Authors. All rights reserved.
*
* Copyright (c) 2022 Loongson Technology Corporation Limited
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
@ -13,203 +11,221 @@
#include "libyuv/rotate_row.h"
#if !defined(LIBYUV_DISABLE_LSX) && defined(__loongarch_sx)
#include "libyuv/loongson_intrinsics.h"
#ifdef __cplusplus
namespace libyuv {
extern "C" {
#endif
#define ILVLH_B(in0, in1, in2, in3, out0, out1, out2, out3) \
{ \
DUP2_ARG2(__lsx_vilvl_b, in1, in0, in3, in2, out0, out2); \
DUP2_ARG2(__lsx_vilvh_b, in1, in0, in3, in2, out1, out3); \
}
#define ILVLH_H(in0, in1, in2, in3, out0, out1, out2, out3) \
{ \
DUP2_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, out0, out2); \
DUP2_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, out1, out3); \
}
#define ILVLH_W(in0, in1, in2, in3, out0, out1, out2, out3) \
{ \
DUP2_ARG2(__lsx_vilvl_w, in1, in0, in3, in2, out0, out2); \
DUP2_ARG2(__lsx_vilvh_w, in1, in0, in3, in2, out1, out3); \
}
#define ILVLH_D(in0, in1, in2, in3, out0, out1, out2, out3) \
{ \
DUP2_ARG2(__lsx_vilvl_d, in1, in0, in3, in2, out0, out2); \
DUP2_ARG2(__lsx_vilvh_d, in1, in0, in3, in2, out1, out3); \
}
#define LSX_ST_4(_dst0, _dst1, _dst2, _dst3, _dst, _stride, _stride2, \
_stride3, _stride4) \
{ \
__lsx_vst(_dst0, _dst, 0); \
__lsx_vstx(_dst1, _dst, _stride); \
__lsx_vstx(_dst2, _dst, _stride2); \
__lsx_vstx(_dst3, _dst, _stride3); \
_dst += _stride4; \
}
#define LSX_ST_2(_dst0, _dst1, _dst, _stride, _stride2) \
{ \
__lsx_vst(_dst0, _dst, 0); \
__lsx_vstx(_dst1, _dst, _stride); \
_dst += _stride2; \
}
void TransposeWx16_LSX(const uint8_t* src,
void TransposeWx8_LSX(const uint8_t* src,
int src_stride,
uint8_t* dst,
int dst_stride,
int width) {
int x;
int len = width / 16;
uint8_t* s;
int src_stride2 = src_stride << 1;
int src_stride3 = src_stride + src_stride2;
int src_stride4 = src_stride2 << 1;
int dst_stride2 = dst_stride << 1;
int dst_stride3 = dst_stride + dst_stride2;
int dst_stride4 = dst_stride2 << 1;
__m128i src0, src1, src2, src3, dst0, dst1, dst2, dst3;
__m128i tmp0, tmp1, tmp2, tmp3;
__m128i reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7;
__m128i res0, res1, res2, res3, res4, res5, res6, res7, res8, res9;
const ptrdiff_t s = src_stride;
const ptrdiff_t d = dst_stride;
const uint8_t* t;
asm volatile(
"srli.w %[w], %[w], 4 \n"
"beqz %[w], 2f \n"
"1: \n"
"move %[t], %[src] \n"
"vld $vr0, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr1, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr2, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr3, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr4, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr5, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr6, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr7, %[t], 0 \n"
"addi.d %[src], %[src], 16 \n"
for (x = 0; x < len; x++) {
s = (uint8_t*)src;
src0 = __lsx_vld(s, 0);
src1 = __lsx_vldx(s, src_stride);
src2 = __lsx_vldx(s, src_stride2);
src3 = __lsx_vldx(s, src_stride3);
s += src_stride4;
ILVLH_B(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
ILVLH_H(tmp0, tmp2, tmp1, tmp3, reg0, reg1, reg2, reg3);
src0 = __lsx_vld(s, 0);
src1 = __lsx_vldx(s, src_stride);
src2 = __lsx_vldx(s, src_stride2);
src3 = __lsx_vldx(s, src_stride3);
s += src_stride4;
ILVLH_B(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
ILVLH_H(tmp0, tmp2, tmp1, tmp3, reg4, reg5, reg6, reg7);
ILVLH_W(reg0, reg4, reg1, reg5, res0, res1, res2, res3);
ILVLH_W(reg2, reg6, reg3, reg7, res4, res5, res6, res7);
src0 = __lsx_vld(s, 0);
src1 = __lsx_vldx(s, src_stride);
src2 = __lsx_vldx(s, src_stride2);
src3 = __lsx_vldx(s, src_stride3);
s += src_stride4;
ILVLH_B(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
ILVLH_H(tmp0, tmp2, tmp1, tmp3, reg0, reg1, reg2, reg3);
src0 = __lsx_vld(s, 0);
src1 = __lsx_vldx(s, src_stride);
src2 = __lsx_vldx(s, src_stride2);
src3 = __lsx_vldx(s, src_stride3);
s += src_stride4;
ILVLH_B(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
ILVLH_H(tmp0, tmp2, tmp1, tmp3, reg4, reg5, reg6, reg7);
res8 = __lsx_vilvl_w(reg4, reg0);
res9 = __lsx_vilvh_w(reg4, reg0);
ILVLH_D(res0, res8, res1, res9, dst0, dst1, dst2, dst3);
LSX_ST_4(dst0, dst1, dst2, dst3, dst, dst_stride, dst_stride2, dst_stride3,
dst_stride4);
res8 = __lsx_vilvl_w(reg5, reg1);
res9 = __lsx_vilvh_w(reg5, reg1);
ILVLH_D(res2, res8, res3, res9, dst0, dst1, dst2, dst3);
LSX_ST_4(dst0, dst1, dst2, dst3, dst, dst_stride, dst_stride2, dst_stride3,
dst_stride4);
res8 = __lsx_vilvl_w(reg6, reg2);
res9 = __lsx_vilvh_w(reg6, reg2);
ILVLH_D(res4, res8, res5, res9, dst0, dst1, dst2, dst3);
LSX_ST_4(dst0, dst1, dst2, dst3, dst, dst_stride, dst_stride2, dst_stride3,
dst_stride4);
res8 = __lsx_vilvl_w(reg7, reg3);
res9 = __lsx_vilvh_w(reg7, reg3);
ILVLH_D(res6, res8, res7, res9, dst0, dst1, dst2, dst3);
LSX_ST_4(dst0, dst1, dst2, dst3, dst, dst_stride, dst_stride2, dst_stride3,
dst_stride4);
src += 16;
}
"vilvl.b $vr8, $vr1, $vr0 \n"
"vilvh.b $vr9, $vr1, $vr0 \n"
"vilvl.b $vr10, $vr3, $vr2 \n"
"vilvh.b $vr11, $vr3, $vr2 \n"
"vilvl.b $vr12, $vr5, $vr4 \n"
"vilvh.b $vr13, $vr5, $vr4 \n"
"vilvl.b $vr14, $vr7, $vr6 \n"
"vilvh.b $vr15, $vr7, $vr6 \n"
"vilvl.h $vr0, $vr10, $vr8 \n"
"vilvh.h $vr1, $vr10, $vr8 \n"
"vilvl.h $vr2, $vr11, $vr9 \n"
"vilvh.h $vr3, $vr11, $vr9 \n"
"vilvl.h $vr4, $vr14, $vr12 \n"
"vilvh.h $vr5, $vr14, $vr12 \n"
"vilvl.h $vr6, $vr15, $vr13 \n"
"vilvh.h $vr7, $vr15, $vr13 \n"
"vilvl.w $vr8, $vr4, $vr0 \n"
"vilvh.w $vr9, $vr4, $vr0 \n"
"vilvl.w $vr10, $vr5, $vr1 \n"
"vilvh.w $vr11, $vr5, $vr1 \n"
"vilvl.w $vr12, $vr6, $vr2 \n"
"vilvh.w $vr13, $vr6, $vr2 \n"
"vilvl.w $vr14, $vr7, $vr3 \n"
"vilvh.w $vr15, $vr7, $vr3 \n"
"vstelm.d $vr8, %[dst], 0, 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr8, %[dst], 0, 1 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr9, %[dst], 0, 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr9, %[dst], 0, 1 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr10, %[dst], 0, 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr10, %[dst], 0, 1 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr11, %[dst], 0, 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr11, %[dst], 0, 1 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr12, %[dst], 0, 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr12, %[dst], 0, 1 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr13, %[dst], 0, 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr13, %[dst], 0, 1 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr14, %[dst], 0, 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr14, %[dst], 0, 1 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr15, %[dst], 0, 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vstelm.d $vr15, %[dst], 0, 1 \n"
"add.d %[dst], %[dst], %[d] \n"
"addi.w %[w], %[w], -1 \n"
"bnez %[w], 1b \n"
"2: \n"
: [src] "+r"(src), // %[src]
[dst] "+r"(dst), // %[dst]
[w] "+r"(width), // %[w]
[t] "=&r"(t) // %[t]
: [s] "r"(s), // %[s]
[d] "r"(d) // %[d]
: "memory", "$vr0", "$vr1", "$vr2", "$vr3", "$vr4", "$vr5", "$vr6",
"$vr7", "$vr8", "$vr9", "$vr10", "$vr11", "$vr12", "$vr13", "$vr14",
"$vr15");
}
void TransposeUVWx16_LSX(const uint8_t* src,
void TransposeUVWx8_LSX(const uint8_t* src,
int src_stride,
uint8_t* dst_a,
int dst_stride_a,
uint8_t* dst_b,
int dst_stride_b,
int width) {
int x;
int len = width / 8;
uint8_t* s;
int src_stride2 = src_stride << 1;
int src_stride3 = src_stride + src_stride2;
int src_stride4 = src_stride2 << 1;
int dst_stride_a2 = dst_stride_a << 1;
int dst_stride_b2 = dst_stride_b << 1;
__m128i src0, src1, src2, src3, dst0, dst1, dst2, dst3;
__m128i tmp0, tmp1, tmp2, tmp3;
__m128i reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7;
__m128i res0, res1, res2, res3, res4, res5, res6, res7, res8, res9;
const ptrdiff_t s = src_stride;
const ptrdiff_t da = dst_stride_a;
const ptrdiff_t db = dst_stride_b;
const uint8_t* t;
asm volatile(
"srli.w %[w], %[w], 3 \n"
"beqz %[w], 2f \n"
"1: \n"
"move %[t], %[src] \n"
"vld $vr0, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr1, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr2, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr3, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr4, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr5, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr6, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr7, %[t], 0 \n"
"addi.d %[src], %[src], 16 \n"
for (x = 0; x < len; x++) {
s = (uint8_t*)src;
src0 = __lsx_vld(s, 0);
src1 = __lsx_vldx(s, src_stride);
src2 = __lsx_vldx(s, src_stride2);
src3 = __lsx_vldx(s, src_stride3);
s += src_stride4;
ILVLH_B(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
ILVLH_H(tmp0, tmp2, tmp1, tmp3, reg0, reg1, reg2, reg3);
src0 = __lsx_vld(s, 0);
src1 = __lsx_vldx(s, src_stride);
src2 = __lsx_vldx(s, src_stride2);
src3 = __lsx_vldx(s, src_stride3);
s += src_stride4;
ILVLH_B(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
ILVLH_H(tmp0, tmp2, tmp1, tmp3, reg4, reg5, reg6, reg7);
ILVLH_W(reg0, reg4, reg1, reg5, res0, res1, res2, res3);
ILVLH_W(reg2, reg6, reg3, reg7, res4, res5, res6, res7);
src0 = __lsx_vld(s, 0);
src1 = __lsx_vldx(s, src_stride);
src2 = __lsx_vldx(s, src_stride2);
src3 = __lsx_vldx(s, src_stride3);
s += src_stride4;
ILVLH_B(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
ILVLH_H(tmp0, tmp2, tmp1, tmp3, reg0, reg1, reg2, reg3);
src0 = __lsx_vld(s, 0);
src1 = __lsx_vldx(s, src_stride);
src2 = __lsx_vldx(s, src_stride2);
src3 = __lsx_vldx(s, src_stride3);
s += src_stride4;
ILVLH_B(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3);
ILVLH_H(tmp0, tmp2, tmp1, tmp3, reg4, reg5, reg6, reg7);
res8 = __lsx_vilvl_w(reg4, reg0);
res9 = __lsx_vilvh_w(reg4, reg0);
ILVLH_D(res0, res8, res1, res9, dst0, dst1, dst2, dst3);
LSX_ST_2(dst0, dst2, dst_a, dst_stride_a, dst_stride_a2);
LSX_ST_2(dst1, dst3, dst_b, dst_stride_b, dst_stride_b2);
res8 = __lsx_vilvl_w(reg5, reg1);
res9 = __lsx_vilvh_w(reg5, reg1);
ILVLH_D(res2, res8, res3, res9, dst0, dst1, dst2, dst3);
LSX_ST_2(dst0, dst2, dst_a, dst_stride_a, dst_stride_a2);
LSX_ST_2(dst1, dst3, dst_b, dst_stride_b, dst_stride_b2);
res8 = __lsx_vilvl_w(reg6, reg2);
res9 = __lsx_vilvh_w(reg6, reg2);
ILVLH_D(res4, res8, res5, res9, dst0, dst1, dst2, dst3);
LSX_ST_2(dst0, dst2, dst_a, dst_stride_a, dst_stride_a2);
LSX_ST_2(dst1, dst3, dst_b, dst_stride_b, dst_stride_b2);
res8 = __lsx_vilvl_w(reg7, reg3);
res9 = __lsx_vilvh_w(reg7, reg3);
ILVLH_D(res6, res8, res7, res9, dst0, dst1, dst2, dst3);
LSX_ST_2(dst0, dst2, dst_a, dst_stride_a, dst_stride_a2);
LSX_ST_2(dst1, dst3, dst_b, dst_stride_b, dst_stride_b2);
src += 16;
}
"vilvl.b $vr8, $vr1, $vr0 \n"
"vilvh.b $vr9, $vr1, $vr0 \n"
"vilvl.b $vr10, $vr3, $vr2 \n"
"vilvh.b $vr11, $vr3, $vr2 \n"
"vilvl.b $vr12, $vr5, $vr4 \n"
"vilvh.b $vr13, $vr5, $vr4 \n"
"vilvl.b $vr14, $vr7, $vr6 \n"
"vilvh.b $vr15, $vr7, $vr6 \n"
"vilvl.h $vr0, $vr10, $vr8 \n"
"vilvh.h $vr1, $vr10, $vr8 \n"
"vilvl.h $vr2, $vr11, $vr9 \n"
"vilvh.h $vr3, $vr11, $vr9 \n"
"vilvl.h $vr4, $vr14, $vr12 \n"
"vilvh.h $vr5, $vr14, $vr12 \n"
"vilvl.h $vr6, $vr15, $vr13 \n"
"vilvh.h $vr7, $vr15, $vr13 \n"
"vilvl.w $vr8, $vr4, $vr0 \n"
"vilvh.w $vr9, $vr4, $vr0 \n"
"vilvl.w $vr10, $vr5, $vr1 \n"
"vilvh.w $vr11, $vr5, $vr1 \n"
"vilvl.w $vr12, $vr6, $vr2 \n"
"vilvh.w $vr13, $vr6, $vr2 \n"
"vilvl.w $vr14, $vr7, $vr3 \n"
"vilvh.w $vr15, $vr7, $vr3 \n"
"vstelm.d $vr8, %[dst_a], 0, 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vstelm.d $vr8, %[dst_b], 0, 1 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vstelm.d $vr9, %[dst_a], 0, 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vstelm.d $vr9, %[dst_b], 0, 1 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vstelm.d $vr10, %[dst_a], 0, 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vstelm.d $vr10, %[dst_b], 0, 1 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vstelm.d $vr11, %[dst_a], 0, 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vstelm.d $vr11, %[dst_b], 0, 1 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vstelm.d $vr12, %[dst_a], 0, 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vstelm.d $vr12, %[dst_b], 0, 1 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vstelm.d $vr13, %[dst_a], 0, 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vstelm.d $vr13, %[dst_b], 0, 1 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vstelm.d $vr14, %[dst_a], 0, 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vstelm.d $vr14, %[dst_b], 0, 1 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"vstelm.d $vr15, %[dst_a], 0, 0 \n"
"add.d %[dst_a], %[dst_a], %[da] \n"
"vstelm.d $vr15, %[dst_b], 0, 1 \n"
"add.d %[dst_b], %[dst_b], %[db] \n"
"addi.w %[w], %[w], -1 \n"
"bnez %[w], 1b \n"
"2: \n"
: [src] "+r"(src), // %[src]
[dst_a] "+r"(dst_a), // %[dst_a]
[dst_b] "+r"(dst_b), // %[dst_b]
[w] "+r"(width), // %[w]
[t] "=&r"(t) // %[t]
: [s] "r"(s), // %[s]
[da] "r"(da), // %[da]
[db] "r"(db) // %[db]
: "memory", "$vr0", "$vr1", "$vr2", "$vr3", "$vr4", "$vr5", "$vr6",
"$vr7", "$vr8", "$vr9", "$vr10", "$vr11", "$vr12", "$vr13", "$vr14",
"$vr15");
}
void TransposeWx4_32_LSX(const uint8_t* src,
@ -217,29 +233,57 @@ void TransposeWx4_32_LSX(const uint8_t* src,
uint8_t* dst,
int dst_stride,
int width) {
int x;
int len = width / 4;
ptrdiff_t src_stride2 = src_stride * 2;
ptrdiff_t src_stride3 = src_stride + src_stride2;
ptrdiff_t src_stride4 = src_stride * 4;
ptrdiff_t dst_stride2 = dst_stride * 2;
ptrdiff_t dst_stride3 = dst_stride + dst_stride2;
__m128i src0, src1, src2, src3;
__m128i dst0, dst1, dst2, dst3;
const ptrdiff_t s = src_stride;
const ptrdiff_t s2 = s * 2;
const ptrdiff_t s3 = s + s2;
const ptrdiff_t s4 = s * 4;
uint8_t* dst0 = dst;
uint8_t* dst1 = dst0 + dst_stride;
uint8_t* dst2 = dst1 + dst_stride;
uint8_t* dst3 = dst2 + dst_stride;
asm volatile(
"srli.w %[w], %[w], 2 \n"
"beqz %[w], 2f \n"
"1: \n"
"vld $vr0, %[src], 0 \n"
"vldx $vr1, %[src], %[s] \n"
"vldx $vr2, %[src], %[s2] \n"
"vldx $vr3, %[src], %[s3] \n"
"add.d %[src], %[src], %[s4] \n"
for (x = 0; x < len; x++) {
src0 = __lsx_vld(src, 0);
src1 = __lsx_vldx(src, src_stride);
src2 = __lsx_vldx(src, src_stride2);
src3 = __lsx_vldx(src, src_stride3);
LSX_TRANSPOSE4x4_W(src0, src1, src2, src3, dst0, dst1, dst2, dst3);
__lsx_vst(dst0, dst, 0);
__lsx_vstx(dst1, dst, dst_stride);
__lsx_vstx(dst2, dst, dst_stride2);
__lsx_vstx(dst3, dst, dst_stride3);
dst += 16;
src += src_stride4;
}
"vilvl.w $vr4, $vr1, $vr0 \n"
"vilvh.w $vr5, $vr1, $vr0 \n"
"vilvl.w $vr6, $vr3, $vr2 \n"
"vilvh.w $vr7, $vr3, $vr2 \n"
"vilvl.d $vr0, $vr6, $vr4 \n"
"vilvh.d $vr1, $vr6, $vr4 \n"
"vilvl.d $vr2, $vr7, $vr5 \n"
"vilvh.d $vr3, $vr7, $vr5 \n"
"vst $vr0, %[dst0], 0 \n"
"vst $vr1, %[dst1], 0 \n"
"vst $vr2, %[dst2], 0 \n"
"vst $vr3, %[dst3], 0 \n"
"addi.d %[dst0], %[dst0], 16 \n"
"addi.d %[dst1], %[dst1], 16 \n"
"addi.d %[dst2], %[dst2], 16 \n"
"addi.d %[dst3], %[dst3], 16 \n"
"addi.w %[w], %[w], -1 \n"
"bnez %[w], 1b \n"
"2: \n"
: [src] "+r"(src), // %[src]
[dst0] "+r"(dst0), // %[dst0]
[dst1] "+r"(dst1), // %[dst1]
[dst2] "+r"(dst2), // %[dst2]
[dst3] "+r"(dst3), // %[dst3]
[w] "+r"(width) // %[w]
: [s] "r"(s), // %[s]
[s2] "r"(s2), // %[s2]
[s3] "r"(s3), // %[s3]
[s4] "r"(s4) // %[s4]
: "memory", "$vr0", "$vr1", "$vr2", "$vr3", "$vr4", "$vr5", "$vr6",
"$vr7");
}
void TransposeWx8_16_LSX(const uint16_t* src,
@ -251,46 +295,84 @@ void TransposeWx8_16_LSX(const uint16_t* src,
const ptrdiff_t d = (ptrdiff_t)dst_stride * 2;
const uint8_t* src_b = (const uint8_t*)src;
uint8_t* dst_b = (uint8_t*)dst;
while (width > 0) {
__m128i r0 = __lsx_vld(src_b, 0);
__m128i r1 = __lsx_vldx(src_b, s);
__m128i r2 = __lsx_vldx(src_b, s * 2);
__m128i r3 = __lsx_vldx(src_b, s * 3);
__m128i r4 = __lsx_vldx(src_b, s * 4);
__m128i r5 = __lsx_vldx(src_b, s * 5);
__m128i r6 = __lsx_vldx(src_b, s * 6);
__m128i r7 = __lsx_vldx(src_b, s * 7);
const uint8_t* t;
asm volatile(
"srli.w %[w], %[w], 3 \n"
"beqz %[w], 2f \n"
"1: \n"
"move %[t], %[src] \n"
"vld $vr0, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr1, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr2, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr3, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr4, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr5, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr6, %[t], 0 \n"
"add.d %[t], %[t], %[s] \n"
"vld $vr7, %[t], 0 \n"
"addi.d %[src], %[src], 16 \n"
__m128i t0 = __lsx_vilvl_h(r1, r0);
__m128i t1 = __lsx_vilvh_h(r1, r0);
__m128i t2 = __lsx_vilvl_h(r3, r2);
__m128i t3 = __lsx_vilvh_h(r3, r2);
__m128i t4 = __lsx_vilvl_h(r5, r4);
__m128i t5 = __lsx_vilvh_h(r5, r4);
__m128i t6 = __lsx_vilvl_h(r7, r6);
__m128i t7 = __lsx_vilvh_h(r7, r6);
"vilvl.h $vr8, $vr1, $vr0 \n"
"vilvh.h $vr9, $vr1, $vr0 \n"
"vilvl.h $vr10, $vr3, $vr2 \n"
"vilvh.h $vr11, $vr3, $vr2 \n"
"vilvl.h $vr12, $vr5, $vr4 \n"
"vilvh.h $vr13, $vr5, $vr4 \n"
"vilvl.h $vr14, $vr7, $vr6 \n"
"vilvh.h $vr15, $vr7, $vr6 \n"
__m128i u0 = __lsx_vilvl_w(t2, t0);
__m128i u1 = __lsx_vilvh_w(t2, t0);
__m128i u2 = __lsx_vilvl_w(t3, t1);
__m128i u3 = __lsx_vilvh_w(t3, t1);
__m128i u4 = __lsx_vilvl_w(t6, t4);
__m128i u5 = __lsx_vilvh_w(t6, t4);
__m128i u6 = __lsx_vilvl_w(t7, t5);
__m128i u7 = __lsx_vilvh_w(t7, t5);
"vilvl.w $vr0, $vr10, $vr8 \n"
"vilvh.w $vr1, $vr10, $vr8 \n"
"vilvl.w $vr2, $vr11, $vr9 \n"
"vilvh.w $vr3, $vr11, $vr9 \n"
"vilvl.w $vr4, $vr14, $vr12 \n"
"vilvh.w $vr5, $vr14, $vr12 \n"
"vilvl.w $vr6, $vr15, $vr13 \n"
"vilvh.w $vr7, $vr15, $vr13 \n"
__lsx_vst(__lsx_vilvl_d(u4, u0), dst_b, 0);
__lsx_vstx(__lsx_vilvh_d(u4, u0), dst_b, d);
__lsx_vstx(__lsx_vilvl_d(u5, u1), dst_b, d * 2);
__lsx_vstx(__lsx_vilvh_d(u5, u1), dst_b, d * 3);
__lsx_vstx(__lsx_vilvl_d(u6, u2), dst_b, d * 4);
__lsx_vstx(__lsx_vilvh_d(u6, u2), dst_b, d * 5);
__lsx_vstx(__lsx_vilvl_d(u7, u3), dst_b, d * 6);
__lsx_vstx(__lsx_vilvh_d(u7, u3), dst_b, d * 7);
src_b += 16;
dst_b += d * 8;
width -= 8;
}
"vilvl.d $vr8, $vr4, $vr0 \n"
"vilvh.d $vr9, $vr4, $vr0 \n"
"vilvl.d $vr10, $vr5, $vr1 \n"
"vilvh.d $vr11, $vr5, $vr1 \n"
"vilvl.d $vr12, $vr6, $vr2 \n"
"vilvh.d $vr13, $vr6, $vr2 \n"
"vilvl.d $vr14, $vr7, $vr3 \n"
"vilvh.d $vr15, $vr7, $vr3 \n"
"vst $vr8, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr9, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr10, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr11, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr12, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr13, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr14, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"vst $vr15, %[dst], 0 \n"
"add.d %[dst], %[dst], %[d] \n"
"addi.w %[w], %[w], -1 \n"
"bnez %[w], 1b \n"
"2: \n"
: [src] "+r"(src_b), // %[src]
[dst] "+r"(dst_b), // %[dst]
[w] "+r"(width), // %[w]
[t] "=&r"(t) // %[t]
: [s] "r"(s), // %[s]
[d] "r"(d) // %[d]
: "memory", "$vr0", "$vr1", "$vr2", "$vr3", "$vr4", "$vr5", "$vr6",
"$vr7", "$vr8", "$vr9", "$vr10", "$vr11", "$vr12", "$vr13", "$vr14",
"$vr15");
}
#ifdef __cplusplus

View File

@ -115,7 +115,7 @@ ANY41C(I444AlphaToARGBRow_Any_NEON, I444AlphaToARGBRow_NEON, 0, 0, 4, 7)
ANY41C(I422AlphaToARGBRow_Any_NEON, I422AlphaToARGBRow_NEON, 1, 0, 4, 7)
#endif
#ifdef HAS_I422ALPHATOARGBROW_LSX
ANY41C(I422AlphaToARGBRow_Any_LSX, I422AlphaToARGBRow_LSX, 1, 0, 4, 15)
ANY41C(I422AlphaToARGBRow_Any_LSX, I422AlphaToARGBRow_LSX, 1, 0, 4, 7)
#endif
#ifdef HAS_I422ALPHATOARGBROW_LASX
ANY41C(I422AlphaToARGBRow_Any_LASX, I422AlphaToARGBRow_LASX, 1, 0, 4, 15)
@ -452,23 +452,26 @@ ANY31C(I422ToARGB1555Row_Any_NEON, I422ToARGB1555Row_NEON, 1, 0, 2, 7)
ANY31C(I422ToRGB565Row_Any_NEON, I422ToRGB565Row_NEON, 1, 0, 2, 7)
#endif
#ifdef HAS_I422TOARGBROW_LSX
ANY31C(I422ToARGBRow_Any_LSX, I422ToARGBRow_LSX, 1, 0, 4, 15)
ANY31C(I422ToRGBARow_Any_LSX, I422ToRGBARow_LSX, 1, 0, 4, 15)
ANY31C(I422ToRGB24Row_Any_LSX, I422ToRGB24Row_LSX, 1, 0, 3, 15)
ANY31C(I422ToRGB565Row_Any_LSX, I422ToRGB565Row_LSX, 1, 0, 2, 15)
ANY31C(I422ToARGB4444Row_Any_LSX, I422ToARGB4444Row_LSX, 1, 0, 2, 15)
ANY31C(I422ToARGB1555Row_Any_LSX, I422ToARGB1555Row_LSX, 1, 0, 2, 15)
ANY31C(I422ToARGBRow_Any_LSX, I422ToARGBRow_LSX, 1, 0, 4, 7)
ANY31C(I422ToRGBARow_Any_LSX, I422ToRGBARow_LSX, 1, 0, 4, 7)
ANY31C(I422ToRGB24Row_Any_LSX, I422ToRGB24Row_LSX, 1, 0, 3, 7)
ANY31C(I422ToRGB565Row_Any_LSX, I422ToRGB565Row_LSX, 1, 0, 2, 7)
ANY31C(I422ToARGB4444Row_Any_LSX, I422ToARGB4444Row_LSX, 1, 0, 2, 7)
ANY31C(I422ToARGB1555Row_Any_LSX, I422ToARGB1555Row_LSX, 1, 0, 2, 7)
#endif
#ifdef HAS_I422TOARGBROW_LASX
ANY31C(I422ToARGBRow_Any_LASX, I422ToARGBRow_LASX, 1, 0, 4, 31)
ANY31C(I422ToRGBARow_Any_LASX, I422ToRGBARow_LASX, 1, 0, 4, 31)
ANY31C(I422ToRGB24Row_Any_LASX, I422ToRGB24Row_LASX, 1, 0, 3, 31)
ANY31C(I422ToRGB565Row_Any_LASX, I422ToRGB565Row_LASX, 1, 0, 2, 31)
ANY31C(I422ToARGB4444Row_Any_LASX, I422ToARGB4444Row_LASX, 1, 0, 2, 31)
ANY31C(I422ToARGB1555Row_Any_LASX, I422ToARGB1555Row_LASX, 1, 0, 2, 31)
ANY31C(I422ToARGBRow_Any_LASX, I422ToARGBRow_LASX, 1, 0, 4, 15)
ANY31C(I422ToRGBARow_Any_LASX, I422ToRGBARow_LASX, 1, 0, 4, 15)
ANY31C(I422ToRGB24Row_Any_LASX, I422ToRGB24Row_LASX, 1, 0, 3, 15)
ANY31C(I422ToRGB565Row_Any_LASX, I422ToRGB565Row_LASX, 1, 0, 2, 15)
ANY31C(I422ToARGB4444Row_Any_LASX, I422ToARGB4444Row_LASX, 1, 0, 2, 15)
ANY31C(I422ToARGB1555Row_Any_LASX, I422ToARGB1555Row_LASX, 1, 0, 2, 15)
#endif
#ifdef HAS_I444TOARGBROW_LSX
ANY31C(I444ToARGBRow_Any_LSX, I444ToARGBRow_LSX, 0, 0, 4, 15)
ANY31C(I444ToARGBRow_Any_LSX, I444ToARGBRow_LSX, 0, 0, 4, 7)
#endif
#ifdef HAS_I444TOARGBROW_LASX
ANY31C(I444ToARGBRow_Any_LASX, I444ToARGBRow_LASX, 0, 0, 4, 15)
#endif
#ifdef HAS_I422TOARGBROW_WASMSIMD
ANY31C(I422ToARGBRow_Any_WASMSIMD, I422ToARGBRow_WASMSIMD, 1, 0, 4, 7)
@ -684,6 +687,9 @@ ANY21(MergeUVRow_Any_NEON, MergeUVRow_NEON, 0, 1, 1, 2, 15)
#ifdef HAS_MERGEUVROW_LSX
ANY21(MergeUVRow_Any_LSX, MergeUVRow_LSX, 0, 1, 1, 2, 15)
#endif
#ifdef HAS_MERGEUVROW_LASX
ANY21(MergeUVRow_Any_LASX, MergeUVRow_LASX, 0, 1, 1, 2, 31)
#endif
#ifdef HAS_NV21TOYUV24ROW_NEON
ANY21(NV21ToYUV24Row_Any_NEON, NV21ToYUV24Row_NEON, 1, 1, 2, 3, 15)
#endif
@ -722,7 +728,10 @@ ANY21(ARGBAddRow_Any_NEON, ARGBAddRow_NEON, 0, 4, 4, 4, 7)
ANY21(ARGBSubtractRow_Any_NEON, ARGBSubtractRow_NEON, 0, 4, 4, 4, 7)
#endif
#ifdef HAS_ARGBBLENDROW_LSX
ANY21(ARGBBlendRow_Any_LSX, ARGBBlendRow_LSX, 0, 4, 4, 4, 7)
ANY21(ARGBBlendRow_Any_LSX, ARGBBlendRow_LSX, 0, 4, 4, 4, 3)
#endif
#ifdef HAS_ARGBBLENDROW_LASX
ANY21(ARGBBlendRow_Any_LASX, ARGBBlendRow_LASX, 0, 4, 4, 4, 7)
#endif
#ifdef HAS_ARGBMULTIPLYROW_LSX
ANY21(ARGBMultiplyRow_Any_LSX, ARGBMultiplyRow_LSX, 0, 4, 4, 4, 3)
@ -749,7 +758,10 @@ ANY21(SobelRow_Any_SSE2, SobelRow_SSE2, 0, 1, 1, 4, 15)
ANY21(SobelRow_Any_NEON, SobelRow_NEON, 0, 1, 1, 4, 7)
#endif
#ifdef HAS_SOBELROW_LSX
ANY21(SobelRow_Any_LSX, SobelRow_LSX, 0, 1, 1, 4, 15)
ANY21(SobelRow_Any_LSX, SobelRow_LSX, 0, 1, 1, 4, 7)
#endif
#ifdef HAS_SOBELROW_LASX
ANY21(SobelRow_Any_LASX, SobelRow_LASX, 0, 1, 1, 4, 15)
#endif
#ifdef HAS_SOBELTOPLANEROW_SSE2
ANY21(SobelToPlaneRow_Any_SSE2, SobelToPlaneRow_SSE2, 0, 1, 1, 1, 15)
@ -758,7 +770,10 @@ ANY21(SobelToPlaneRow_Any_SSE2, SobelToPlaneRow_SSE2, 0, 1, 1, 1, 15)
ANY21(SobelToPlaneRow_Any_NEON, SobelToPlaneRow_NEON, 0, 1, 1, 1, 15)
#endif
#ifdef HAS_SOBELTOPLANEROW_LSX
ANY21(SobelToPlaneRow_Any_LSX, SobelToPlaneRow_LSX, 0, 1, 1, 1, 31)
ANY21(SobelToPlaneRow_Any_LSX, SobelToPlaneRow_LSX, 0, 1, 1, 1, 15)
#endif
#ifdef HAS_SOBELTOPLANEROW_LASX
ANY21(SobelToPlaneRow_Any_LASX, SobelToPlaneRow_LASX, 0, 1, 1, 1, 31)
#endif
#ifdef HAS_SOBELXYROW_SSE2
ANY21(SobelXYRow_Any_SSE2, SobelXYRow_SSE2, 0, 1, 1, 4, 15)
@ -767,7 +782,10 @@ ANY21(SobelXYRow_Any_SSE2, SobelXYRow_SSE2, 0, 1, 1, 4, 15)
ANY21(SobelXYRow_Any_NEON, SobelXYRow_NEON, 0, 1, 1, 4, 7)
#endif
#ifdef HAS_SOBELXYROW_LSX
ANY21(SobelXYRow_Any_LSX, SobelXYRow_LSX, 0, 1, 1, 4, 15)
ANY21(SobelXYRow_Any_LSX, SobelXYRow_LSX, 0, 1, 1, 4, 7)
#endif
#ifdef HAS_SOBELXYROW_LASX
ANY21(SobelXYRow_Any_LASX, SobelXYRow_LASX, 0, 1, 1, 4, 15)
#endif
#ifdef HAS_MERGEUVROW_WASMSIMD
ANY21(MergeUVRow_Any_WASMSIMD, MergeUVRow_WASMSIMD, 0, 1, 1, 2, 15)
@ -1035,10 +1053,10 @@ ANY11(CopyRow_Any_SSE2, CopyRow_SSE2, 0, 1, 1, 31)
ANY11(CopyRow_Any_NEON, CopyRow_NEON, 0, 1, 1, 31)
#endif
#ifdef HAS_COPYROW_LSX
ANY11(CopyRow_Any_LSX, CopyRow_LSX, 0, 1, 1, 31)
ANY11(CopyRow_Any_LSX, CopyRow_LSX, 0, 1, 1, 15)
#endif
#ifdef HAS_COPYROW_LASX
ANY11(CopyRow_Any_LASX, CopyRow_LASX, 0, 1, 1, 63)
ANY11(CopyRow_Any_LASX, CopyRow_LASX, 0, 1, 1, 31)
#endif
#if defined(HAS_ARGBTORGB24ROW_SSSE3)
ANY11(ARGBToRGB24Row_Any_SSSE3, ARGBToRGB24Row_SSSE3, 0, 4, 3, 15)
@ -1143,7 +1161,10 @@ ANY11(ARGBToARGB1555Row_Any_LASX, ARGBToARGB1555Row_LASX, 0, 4, 2, 15)
ANY11(ARGBToARGB4444Row_Any_LASX, ARGBToARGB4444Row_LASX, 0, 4, 2, 15)
#endif
#if defined(HAS_J400TOARGBROW_LSX)
ANY11(J400ToARGBRow_Any_LSX, J400ToARGBRow_LSX, 0, 1, 4, 15)
ANY11(J400ToARGBRow_Any_LSX, J400ToARGBRow_LSX, 0, 1, 4, 7)
#endif
#if defined(HAS_J400TOARGBROW_LASX)
ANY11(J400ToARGBRow_Any_LASX, J400ToARGBRow_LASX, 0, 1, 4, 15)
#endif
#if defined(HAS_RAWTORGB24ROW_NEON)
ANY11(RAWToRGB24Row_Any_NEON, RAWToRGB24Row_NEON, 0, 3, 3, 15)
@ -1173,10 +1194,10 @@ ANY11(UYVYToYRow_Any_SSE2, UYVYToYRow_SSE2, 1, 4, 1, 15)
ANY11(RGB565ToYRow_Any_NEON, RGB565ToYRow_NEON, 0, 2, 1, 15)
#endif
#ifdef HAS_RGB565TOYROW_LSX
ANY11(RGB565ToYRow_Any_LSX, RGB565ToYRow_LSX, 0, 2, 1, 15)
ANY11(RGB565ToYRow_Any_LSX, RGB565ToYRow_LSX, 0, 2, 1, 7)
#endif
#ifdef HAS_RGB565TOYROW_LASX
ANY11(RGB565ToYRow_Any_LASX, RGB565ToYRow_LASX, 0, 2, 1, 31)
ANY11(RGB565ToYRow_Any_LASX, RGB565ToYRow_LASX, 0, 2, 1, 15)
#endif
#ifdef HAS_ARGB1555TOYROW_NEON
#ifdef __aarch64__
@ -1186,10 +1207,10 @@ ANY11(ARGB1555ToYRow_Any_NEON, ARGB1555ToYRow_NEON, 0, 2, 1, 7)
#endif
#endif
#ifdef HAS_ARGB1555TOYROW_LSX
ANY11(ARGB1555ToYRow_Any_LSX, ARGB1555ToYRow_LSX, 0, 2, 1, 15)
ANY11(ARGB1555ToYRow_Any_LSX, ARGB1555ToYRow_LSX, 0, 2, 1, 7)
#endif
#ifdef HAS_ARGB1555TOYROW_LASX
ANY11(ARGB1555ToYRow_Any_LASX, ARGB1555ToYRow_LASX, 0, 2, 1, 31)
ANY11(ARGB1555ToYRow_Any_LASX, ARGB1555ToYRow_LASX, 0, 2, 1, 15)
#endif
#ifdef HAS_ARGB4444TOYROW_NEON
#ifdef __aarch64__
@ -1253,28 +1274,28 @@ ANY11(RAWToARGBRow_Any_LASX, RAWToARGBRow_LASX, 0, 3, 4, 31)
ANY11(RGB565ToARGBRow_Any_NEON, RGB565ToARGBRow_NEON, 0, 2, 4, 15)
#endif
#ifdef HAS_RGB565TOARGBROW_LSX
ANY11(RGB565ToARGBRow_Any_LSX, RGB565ToARGBRow_LSX, 0, 2, 4, 15)
ANY11(RGB565ToARGBRow_Any_LSX, RGB565ToARGBRow_LSX, 0, 2, 4, 7)
#endif
#ifdef HAS_RGB565TOARGBROW_LASX
ANY11(RGB565ToARGBRow_Any_LASX, RGB565ToARGBRow_LASX, 0, 2, 4, 31)
ANY11(RGB565ToARGBRow_Any_LASX, RGB565ToARGBRow_LASX, 0, 2, 4, 15)
#endif
#ifdef HAS_ARGB1555TOARGBROW_NEON
ANY11(ARGB1555ToARGBRow_Any_NEON, ARGB1555ToARGBRow_NEON, 0, 2, 4, 15)
#endif
#ifdef HAS_ARGB1555TOARGBROW_LSX
ANY11(ARGB1555ToARGBRow_Any_LSX, ARGB1555ToARGBRow_LSX, 0, 2, 4, 15)
ANY11(ARGB1555ToARGBRow_Any_LSX, ARGB1555ToARGBRow_LSX, 0, 2, 4, 7)
#endif
#ifdef HAS_ARGB1555TOARGBROW_LASX
ANY11(ARGB1555ToARGBRow_Any_LASX, ARGB1555ToARGBRow_LASX, 0, 2, 4, 31)
ANY11(ARGB1555ToARGBRow_Any_LASX, ARGB1555ToARGBRow_LASX, 0, 2, 4, 15)
#endif
#ifdef HAS_ARGB4444TOARGBROW_NEON
ANY11(ARGB4444ToARGBRow_Any_NEON, ARGB4444ToARGBRow_NEON, 0, 2, 4, 7)
#endif
#ifdef HAS_ARGB4444TOARGBROW_LSX
ANY11(ARGB4444ToARGBRow_Any_LSX, ARGB4444ToARGBRow_LSX, 0, 2, 4, 15)
ANY11(ARGB4444ToARGBRow_Any_LSX, ARGB4444ToARGBRow_LSX, 0, 2, 4, 7)
#endif
#ifdef HAS_ARGB4444TOARGBROW_LASX
ANY11(ARGB4444ToARGBRow_Any_LASX, ARGB4444ToARGBRow_LASX, 0, 2, 4, 31)
ANY11(ARGB4444ToARGBRow_Any_LASX, ARGB4444ToARGBRow_LASX, 0, 2, 4, 15)
#endif
#ifdef HAS_ARGBATTENUATEROW_SSSE3
ANY11(ARGBAttenuateRow_Any_SSSE3, ARGBAttenuateRow_SSSE3, 0, 4, 4, 3)
@ -1292,10 +1313,10 @@ ANY11(ARGBUnattenuateRow_Any_AVX2, ARGBUnattenuateRow_AVX2, 0, 4, 4, 7)
ANY11(ARGBAttenuateRow_Any_NEON, ARGBAttenuateRow_NEON, 0, 4, 4, 7)
#endif
#ifdef HAS_ARGBATTENUATEROW_LSX
ANY11(ARGBAttenuateRow_Any_LSX, ARGBAttenuateRow_LSX, 0, 4, 4, 7)
ANY11(ARGBAttenuateRow_Any_LSX, ARGBAttenuateRow_LSX, 0, 4, 4, 3)
#endif
#ifdef HAS_ARGBATTENUATEROW_LASX
ANY11(ARGBAttenuateRow_Any_LASX, ARGBAttenuateRow_LASX, 0, 4, 4, 15)
ANY11(ARGBAttenuateRow_Any_LASX, ARGBAttenuateRow_LASX, 0, 4, 4, 7)
#endif
#ifdef HAS_ARGBEXTRACTALPHAROW_SSE2
ANY11(ARGBExtractAlphaRow_Any_SSE2, ARGBExtractAlphaRow_SSE2, 0, 4, 1, 7)
@ -1307,7 +1328,10 @@ ANY11(ARGBExtractAlphaRow_Any_AVX2, ARGBExtractAlphaRow_AVX2, 0, 4, 1, 31)
ANY11(ARGBExtractAlphaRow_Any_NEON, ARGBExtractAlphaRow_NEON, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBEXTRACTALPHAROW_LSX
ANY11(ARGBExtractAlphaRow_Any_LSX, ARGBExtractAlphaRow_LSX, 0, 4, 1, 15)
ANY11(ARGBExtractAlphaRow_Any_LSX, ARGBExtractAlphaRow_LSX, 0, 4, 1, 7)
#endif
#ifdef HAS_ARGBEXTRACTALPHAROW_LASX
ANY11(ARGBExtractAlphaRow_Any_LASX, ARGBExtractAlphaRow_LASX, 0, 4, 1, 15)
#endif
#ifdef HAS_ARGBEXTRACTALPHAROW_WASMSIMD
ANY11(ARGBExtractAlphaRow_Any_WASMSIMD,
@ -1444,6 +1468,14 @@ ANY11P(I400ToARGBRow_Any_LSX,
const struct YuvConstants*,
1,
4,
7)
#endif
#if defined(HAS_I400TOARGBROW_LASX)
ANY11P(I400ToARGBRow_Any_LASX,
I400ToARGBRow_LASX,
const struct YuvConstants*,
1,
4,
15)
#endif
@ -1469,7 +1501,7 @@ ANY11P(ARGBToRGB565DitherRow_Any_LSX,
const uint32_t,
4,
2,
7)
3)
#endif
#if defined(HAS_ARGBTORGB565DITHERROW_LASX)
ANY11P(ARGBToRGB565DitherRow_Any_LASX,
@ -1477,7 +1509,7 @@ ANY11P(ARGBToRGB565DitherRow_Any_LASX,
const uint32_t,
4,
2,
15)
7)
#endif
#ifdef HAS_ARGBSHUFFLEROW_SSSE3
ANY11P(ARGBShuffleRow_Any_SSSE3, ARGBShuffleRow_SSSE3, const uint8_t*, 4, 4, 7)
@ -1489,10 +1521,10 @@ ANY11P(ARGBShuffleRow_Any_AVX2, ARGBShuffleRow_AVX2, const uint8_t*, 4, 4, 15)
ANY11P(ARGBShuffleRow_Any_NEON, ARGBShuffleRow_NEON, const uint8_t*, 4, 4, 3)
#endif
#ifdef HAS_ARGBSHUFFLEROW_LSX
ANY11P(ARGBShuffleRow_Any_LSX, ARGBShuffleRow_LSX, const uint8_t*, 4, 4, 7)
ANY11P(ARGBShuffleRow_Any_LSX, ARGBShuffleRow_LSX, const uint8_t*, 4, 4, 3)
#endif
#ifdef HAS_ARGBSHUFFLEROW_LASX
ANY11P(ARGBShuffleRow_Any_LASX, ARGBShuffleRow_LASX, const uint8_t*, 4, 4, 15)
ANY11P(ARGBShuffleRow_Any_LASX, ARGBShuffleRow_LASX, const uint8_t*, 4, 4, 7)
#endif
#if defined(HAS_ARGBTORGB565DITHERROW_WASMSIMD)
ANY11P(ARGBToRGB565DitherRow_Any_WASMSIMD,
@ -1807,7 +1839,10 @@ ANY11P16(HalfFloatRow_Any_NEON, HalfFloatRow_NEON, uint16_t, uint16_t, 2, 2, 15)
ANY11P16(ByteToFloatRow_Any_NEON, ByteToFloatRow_NEON, uint8_t, float, 1, 3, 7)
#endif
#ifdef HAS_HALFFLOATROW_LSX
ANY11P16(HalfFloatRow_Any_LSX, HalfFloatRow_LSX, uint16_t, uint16_t, 2, 2, 31)
ANY11P16(HalfFloatRow_Any_LSX, HalfFloatRow_LSX, uint16_t, uint16_t, 2, 2, 7)
#endif
#ifdef HAS_HALFFLOATROW_LASX
ANY11P16(HalfFloatRow_Any_LASX, HalfFloatRow_LASX, uint16_t, uint16_t, 2, 2, 15)
#endif
#undef ANY11P16
@ -1849,6 +1884,10 @@ ANY11C(UYVYToARGBRow_Any_NEON, UYVYToARGBRow_NEON, 1, 4, 4, 7)
ANY11C(YUY2ToARGBRow_Any_LSX, YUY2ToARGBRow_LSX, 1, 4, 4, 7)
ANY11C(UYVYToARGBRow_Any_LSX, UYVYToARGBRow_LSX, 1, 4, 4, 7)
#endif
#if defined(HAS_YUY2TOARGBROW_LASX)
ANY11C(YUY2ToARGBRow_Any_LASX, YUY2ToARGBRow_LASX, 1, 4, 4, 15)
ANY11C(UYVYToARGBRow_Any_LASX, UYVYToARGBRow_LASX, 1, 4, 4, 15)
#endif
#undef ANY11C
// Any 1 to 1 interpolate. Takes 2 rows of source via stride.
@ -1885,7 +1924,10 @@ ANY11I(InterpolateRow_Any_AVX2, InterpolateRow_AVX2, uint8_t, uint8_t, 1, 1, 31)
ANY11I(InterpolateRow_Any_NEON, InterpolateRow_NEON, uint8_t, uint8_t, 1, 1, 15)
#endif
#ifdef HAS_INTERPOLATEROW_LSX
ANY11I(InterpolateRow_Any_LSX, InterpolateRow_LSX, uint8_t, uint8_t, 1, 1, 31)
ANY11I(InterpolateRow_Any_LSX, InterpolateRow_LSX, uint8_t, uint8_t, 1, 1, 15)
#endif
#ifdef HAS_INTERPOLATEROW_LASX
ANY11I(InterpolateRow_Any_LASX, InterpolateRow_LASX, uint8_t, uint8_t, 1, 1, 31)
#endif
#ifdef HAS_INTERPOLATEROW_16_NEON
@ -2057,10 +2099,10 @@ ANY11M(MirrorRow_Any_SSSE3, MirrorRow_SSSE3, 1, 15)
ANY11M(MirrorRow_Any_NEON, MirrorRow_NEON, 1, 31)
#endif
#ifdef HAS_MIRRORROW_LSX
ANY11M(MirrorRow_Any_LSX, MirrorRow_LSX, 1, 31)
ANY11M(MirrorRow_Any_LSX, MirrorRow_LSX, 1, 15)
#endif
#ifdef HAS_MIRRORROW_LASX
ANY11M(MirrorRow_Any_LASX, MirrorRow_LASX, 1, 63)
ANY11M(MirrorRow_Any_LASX, MirrorRow_LASX, 1, 31)
#endif
#ifdef HAS_MIRRORUVROW_AVX512BW
ANY11M(MirrorUVRow_Any_AVX512BW, MirrorUVRow_AVX512BW, 2, 31)
@ -2090,10 +2132,10 @@ ANY11M(ARGBMirrorRow_Any_SSE2, ARGBMirrorRow_SSE2, 4, 3)
ANY11M(ARGBMirrorRow_Any_NEON, ARGBMirrorRow_NEON, 4, 7)
#endif
#ifdef HAS_ARGBMIRRORROW_LSX
ANY11M(ARGBMirrorRow_Any_LSX, ARGBMirrorRow_LSX, 4, 7)
ANY11M(ARGBMirrorRow_Any_LSX, ARGBMirrorRow_LSX, 4, 3)
#endif
#ifdef HAS_ARGBMIRRORROW_LASX
ANY11M(ARGBMirrorRow_Any_LASX, ARGBMirrorRow_LASX, 4, 15)
ANY11M(ARGBMirrorRow_Any_LASX, ARGBMirrorRow_LASX, 4, 7)
#endif
#ifdef HAS_RGB24MIRRORROW_AVX2
ANY11M(RGB24MirrorRow_Any_AVX2, RGB24MirrorRow_AVX2, 3, 31)
@ -2140,12 +2182,18 @@ ANY1(SetRow_Any_NEON, SetRow_NEON, uint8_t, 1, 15)
#ifdef HAS_SETROW_LSX
ANY1(SetRow_Any_LSX, SetRow_LSX, uint8_t, 1, 15)
#endif
#ifdef HAS_SETROW_LASX
ANY1(SetRow_Any_LASX, SetRow_LASX, uint8_t, 1, 31)
#endif
#ifdef HAS_ARGBSETROW_NEON
ANY1(ARGBSetRow_Any_NEON, ARGBSetRow_NEON, uint32_t, 4, 3)
#endif
#ifdef HAS_ARGBSETROW_LSX
ANY1(ARGBSetRow_Any_LSX, ARGBSetRow_LSX, uint32_t, 4, 3)
#endif
#ifdef HAS_ARGBSETROW_LASX
ANY1(ARGBSetRow_Any_LASX, ARGBSetRow_LASX, uint32_t, 4, 7)
#endif
#undef ANY1
// Any 1 to 2. Outputs UV planes.
@ -2185,7 +2233,10 @@ ANY12(SplitUVRow_Any_AVX2, SplitUVRow_AVX2, 0, 2, 0, 31)
ANY12(SplitUVRow_Any_NEON, SplitUVRow_NEON, 0, 2, 0, 15)
#endif
#ifdef HAS_SPLITUVROW_LSX
ANY12(SplitUVRow_Any_LSX, SplitUVRow_LSX, 0, 2, 0, 31)
ANY12(SplitUVRow_Any_LSX, SplitUVRow_LSX, 0, 2, 0, 15)
#endif
#ifdef HAS_SPLITUVROW_LASX
ANY12(SplitUVRow_Any_LASX, SplitUVRow_LASX, 0, 2, 0, 31)
#endif
#ifdef HAS_YUY2TOUV422ROW_AVX2
ANY12(YUY2ToUV422Row_Any_AVX2, YUY2ToUV422Row_AVX2, 1, 4, 1, 31)
@ -2567,13 +2618,15 @@ ANY11MC(ARGB1555ToYMatrixRow_Any_NEON, ARGB1555ToYMatrixRow_NEON, 2, 15)
ANY11MC(ARGB4444ToYMatrixRow_Any_NEON, ARGB4444ToYMatrixRow_NEON, 2, 15)
#endif
#ifdef HAS_ARGBTOYMATRIXROW_LSX
ANY11MC(ARGBToYMatrixRow_Any_LSX, ARGBToYMatrixRow_LSX, 4, 15)
ANY11MC(ARGBToYMatrixRow_Any_LSX, ARGBToYMatrixRow_LSX, 4, 7)
#endif
#ifdef HAS_ARGBTOYMATRIXROW_LASX
ANY11MC(ARGBToYMatrixRow_Any_LASX, ARGBToYMatrixRow_LASX, 4, 15)
#endif
#ifdef HAS_RGBTOYMATRIXROW_LSX
ANY11MC(RGBToYMatrixRow_Any_LSX, RGBToYMatrixRow_LSX, 3, 15)
#endif
#ifdef HAS_ARGBTOYMATRIXROW_LASX
ANY11MC(ARGBToYMatrixRow_Any_LASX, ARGBToYMatrixRow_LASX, 4, 31)
#ifdef HAS_RGBTOYMATRIXROW_LASX
ANY11MC(RGBToYMatrixRow_Any_LASX, RGBToYMatrixRow_LASX, 3, 31)
#endif
#ifdef HAS_ARGBTOYMATRIXROW_RVV

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -130,7 +130,7 @@ static void ScalePlaneDown2(int src_width,
? ScaleRowDown2_Any_LSX
: (filtering == kFilterLinear ? ScaleRowDown2Linear_Any_LSX
: ScaleRowDown2Box_Any_LSX);
if (IS_ALIGNED(dst_width, 32)) {
if (IS_ALIGNED(dst_width, 16)) {
ScaleRowDown2 = filtering == kFilterNone ? ScaleRowDown2_LSX
: (filtering == kFilterLinear
? ScaleRowDown2Linear_LSX
@ -288,7 +288,7 @@ static void ScalePlaneDown4(int src_width,
if (TestCpuFlag(kCpuHasLSX)) {
ScaleRowDown4 =
filtering ? ScaleRowDown4Box_Any_LSX : ScaleRowDown4_Any_LSX;
if (IS_ALIGNED(dst_width, 16)) {
if (IS_ALIGNED(dst_width, 8)) {
ScaleRowDown4 = filtering ? ScaleRowDown4Box_LSX : ScaleRowDown4_LSX;
}
}
@ -415,7 +415,7 @@ static void ScalePlaneDown34(int src_width,
#endif
#if defined(HAS_SCALEROWDOWN34_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
if (dst_width % 48 == 0) {
if (dst_width % 12 == 0) {
if (!filtering) {
ScaleRowDown34_0 = ScaleRowDown34_LSX;
ScaleRowDown34_1 = ScaleRowDown34_LSX;
@ -1157,11 +1157,19 @@ static int ScalePlaneBilinearDown(int src_width,
#if defined(HAS_INTERPOLATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
InterpolateRow = InterpolateRow_Any_LSX;
if (IS_ALIGNED(src_width, 32)) {
if (IS_ALIGNED(src_width, 16)) {
InterpolateRow = InterpolateRow_LSX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(src_width, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;
@ -1192,7 +1200,7 @@ static int ScalePlaneBilinearDown(int src_width,
#if defined(HAS_SCALEFILTERCOLS_LSX)
if (TestCpuFlag(kCpuHasLSX) && src_width < 32768) {
ScaleFilterCols = ScaleFilterCols_Any_LSX;
if (IS_ALIGNED(dst_width, 16)) {
if (IS_ALIGNED(dst_width, 4)) {
ScaleFilterCols = ScaleFilterCols_LSX;
}
}
@ -1426,7 +1434,7 @@ static int ScalePlaneBilinearUp(int src_width,
#if defined(HAS_SCALEFILTERCOLS_LSX)
if (filtering && TestCpuFlag(kCpuHasLSX) && src_width < 32768) {
ScaleFilterCols = ScaleFilterCols_Any_LSX;
if (IS_ALIGNED(dst_width, 16)) {
if (IS_ALIGNED(dst_width, 4)) {
ScaleFilterCols = ScaleFilterCols_LSX;
}
}

View File

@ -154,19 +154,19 @@ SDANY(ScaleUVRowDown2Box_Any_NEON,
7)
#endif
#ifdef HAS_SCALEROWDOWN2_LSX
SDANY(ScaleRowDown2_Any_LSX, ScaleRowDown2_LSX, ScaleRowDown2_C, 2, 1, 31)
SDANY(ScaleRowDown2_Any_LSX, ScaleRowDown2_LSX, ScaleRowDown2_C, 2, 1, 15)
SDANY(ScaleRowDown2Linear_Any_LSX,
ScaleRowDown2Linear_LSX,
ScaleRowDown2Linear_C,
2,
1,
31)
15)
SDANY(ScaleRowDown2Box_Any_LSX,
ScaleRowDown2Box_LSX,
ScaleRowDown2Box_C,
2,
1,
31)
15)
#endif
#ifdef HAS_SCALEROWDOWN4_SSSE3
SDANY(ScaleRowDown4_Any_SSSE3, ScaleRowDown4_SSSE3, ScaleRowDown4_C, 4, 1, 7)
@ -196,13 +196,13 @@ SDANY(ScaleRowDown4Box_Any_NEON,
7)
#endif
#ifdef HAS_SCALEROWDOWN4_LSX
SDANY(ScaleRowDown4_Any_LSX, ScaleRowDown4_LSX, ScaleRowDown4_C, 4, 1, 15)
SDANY(ScaleRowDown4_Any_LSX, ScaleRowDown4_LSX, ScaleRowDown4_C, 4, 1, 7)
SDANY(ScaleRowDown4Box_Any_LSX,
ScaleRowDown4Box_LSX,
ScaleRowDown4Box_C,
4,
1,
15)
7)
#endif
#ifdef HAS_SCALEROWDOWN34_SSSE3
SDANY(ScaleRowDown34_Any_SSSE3,
@ -271,19 +271,19 @@ SDANY(ScaleRowDown34_Any_LSX,
ScaleRowDown34_C,
4 / 3,
1,
47)
11)
SDANY(ScaleRowDown34_0_Box_Any_LSX,
ScaleRowDown34_0_Box_LSX,
ScaleRowDown34_0_Box_C,
4 / 3,
1,
47)
11)
SDANY(ScaleRowDown34_1_Box_Any_LSX,
ScaleRowDown34_1_Box_LSX,
ScaleRowDown34_1_Box_C,
4 / 3,
1,
47)
11)
#endif
#ifdef HAS_SCALEROWDOWN38_SSSE3
SDANY(ScaleRowDown38_Any_SSSE3,
@ -669,7 +669,7 @@ SAANY(ScaleAddRow_Any_LSX, ScaleAddRow_LSX, ScaleAddRow_C, 15)
CANY(ScaleFilterCols_Any_NEON, ScaleFilterCols_NEON, ScaleFilterCols_C, 1, 7)
#endif
#ifdef HAS_SCALEFILTERCOLS_LSX
CANY(ScaleFilterCols_Any_LSX, ScaleFilterCols_LSX, ScaleFilterCols_C, 1, 15)
CANY(ScaleFilterCols_Any_LSX, ScaleFilterCols_LSX, ScaleFilterCols_C, 1, 3)
#endif
#ifdef HAS_SCALEARGBCOLS_NEON
CANY(ScaleARGBCols_Any_NEON, ScaleARGBCols_NEON, ScaleARGBCols_C, 4, 7)
@ -689,7 +689,7 @@ CANY(ScaleARGBFilterCols_Any_LSX,
ScaleARGBFilterCols_LSX,
ScaleARGBFilterCols_C,
4,
7)
3)
#endif
#ifdef HAS_SCALEFILTERCOLS_WASMSIMD
CANY(ScaleFilterCols_Any_WASMSIMD,

View File

@ -399,11 +399,19 @@ static int ScaleARGBBilinearDown(int src_width,
#if defined(HAS_INTERPOLATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
InterpolateRow = InterpolateRow_Any_LSX;
if (IS_ALIGNED(clip_src_width, 32)) {
if (IS_ALIGNED(clip_src_width, 16)) {
InterpolateRow = InterpolateRow_LSX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(clip_src_width, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;
@ -433,7 +441,7 @@ static int ScaleARGBBilinearDown(int src_width,
#if defined(HAS_SCALEARGBFILTERCOLS_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
ScaleARGBFilterCols = ScaleARGBFilterCols_Any_LSX;
if (IS_ALIGNED(dst_width, 8)) {
if (IS_ALIGNED(dst_width, 4)) {
ScaleARGBFilterCols = ScaleARGBFilterCols_LSX;
}
}
@ -544,11 +552,19 @@ static int ScaleARGBBilinearUp(int src_width,
#if defined(HAS_INTERPOLATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
InterpolateRow = InterpolateRow_Any_LSX;
if (IS_ALIGNED(dst_width, 8)) {
if (IS_ALIGNED(dst_width, 16)) {
InterpolateRow = InterpolateRow_LSX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(dst_width, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;
@ -582,7 +598,7 @@ static int ScaleARGBBilinearUp(int src_width,
#if defined(HAS_SCALEARGBFILTERCOLS_LSX)
if (filtering && TestCpuFlag(kCpuHasLSX)) {
ScaleARGBFilterCols = ScaleARGBFilterCols_Any_LSX;
if (IS_ALIGNED(dst_width, 8)) {
if (IS_ALIGNED(dst_width, 4)) {
ScaleARGBFilterCols = ScaleARGBFilterCols_LSX;
}
}

View File

@ -1437,11 +1437,19 @@ void ScalePlaneVertical(int src_height,
#if defined(HAS_INTERPOLATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
InterpolateRow = InterpolateRow_Any_LSX;
if (IS_ALIGNED(dst_width_bytes, 32)) {
if (IS_ALIGNED(dst_width_bytes, 16)) {
InterpolateRow = InterpolateRow_LSX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(dst_width_bytes, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;

File diff suppressed because it is too large Load Diff

View File

@ -548,11 +548,19 @@ static int ScaleUVBilinearDown(int src_width,
#if defined(HAS_INTERPOLATEROW_LSX)
if (TestCpuFlag(kCpuHasLSX)) {
InterpolateRow = InterpolateRow_Any_LSX;
if (IS_ALIGNED(clip_src_width, 32)) {
if (IS_ALIGNED(clip_src_width, 16)) {
InterpolateRow = InterpolateRow_LSX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(clip_src_width, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;
@ -681,6 +689,14 @@ static int ScaleUVBilinearUp(int src_width,
}
}
#endif
#if defined(HAS_INTERPOLATEROW_LASX)
if (TestCpuFlag(kCpuHasLASX)) {
InterpolateRow = InterpolateRow_Any_LASX;
if (IS_ALIGNED(dst_width, 32)) {
InterpolateRow = InterpolateRow_LASX;
}
}
#endif
#if defined(HAS_INTERPOLATEROW_RVV)
if (TestCpuFlag(kCpuHasRVV)) {
InterpolateRow = InterpolateRow_RVV;