mirror of
https://chromium.googlesource.com/libyuv/libyuv
synced 2026-10-28 18:07:12 +08:00
[libyuv] Rewrite LoongArch LSX/LASX kernels in compact inline asm
Reduce loop unrolling across LoongArch LSX (128-bit) and LASX (256-bit) 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) | 0 | 68 | 4 | 20 LSX | 0 | 68 | 4 | 20 LASX | 0 | 68 | 4 | 0 Removes 1,935 macro/helper lines from loongson_intrinsics.h (-99.3%) and reduces total LoongArch compiled .text size by 9,246 bytes (-24.3% overall, -36.9% row_lsx.cc, -52.7% scale_lsx.cc, -31.2% rotate_lsx.cc, -2.8% row_lasx.cc while adding +25 LASX functions): File | Before | After | Change -------------------|----------|----------|-------- scale_lsx.cc.o | 6,102 B | 2,888 B | -52.7% row_lsx.cc.o | 16,704 B | 10,544 B | -36.9% rotate_lsx.cc.o | 1,488 B | 1,024 B | -31.2% row_lasx.cc.o | 13,168 B | 12,800 B | -2.8% rotate_lasx.cc.o | 544 B | 1,504 B | +176.5% TOTAL .text | 38,006 B | 28,760 B | -24.3% R=wtc@google.com, yuanhecai@loongson.cn Test: qemu-loongarch64 -cpu la464 libyuv_unittest (LASX and LIBYUV_DISABLE_LASX=1) Change-Id: I11c1143ad2aad0399f10b2c3fc9bc4c02c740c59
This commit is contained in:
parent
63b56324de
commit
c28ebdd357
File diff suppressed because it is too large
Load Diff
@ -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,11 +169,16 @@ void TransposeWx16_AVX512BW(const uint8_t* src,
|
||||
uint8_t* dst,
|
||||
int dst_stride,
|
||||
int width);
|
||||
void TransposeWx16_LSX(const uint8_t* src,
|
||||
int src_stride,
|
||||
uint8_t* dst,
|
||||
int dst_stride,
|
||||
int width);
|
||||
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,
|
||||
int width);
|
||||
void TransposeWx8_WASMSIMD(const uint8_t* src,
|
||||
int src_stride,
|
||||
uint8_t* dst,
|
||||
@ -203,11 +210,16 @@ void TransposeWx16_Any_AVX2(const uint8_t* src,
|
||||
uint8_t* dst,
|
||||
int dst_stride,
|
||||
int width);
|
||||
void TransposeWx16_Any_LSX(const uint8_t* src,
|
||||
int src_stride,
|
||||
uint8_t* dst,
|
||||
int dst_stride,
|
||||
int width);
|
||||
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,
|
||||
int width);
|
||||
void TransposeWx8_Any_WASMSIMD(const uint8_t* src,
|
||||
int src_stride,
|
||||
uint8_t* dst,
|
||||
@ -278,13 +290,20 @@ void TransposeUVWxH_SME(const uint8_t* src,
|
||||
int dst_stride_b,
|
||||
int width,
|
||||
int height);
|
||||
void TransposeUVWx16_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 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,
|
||||
uint8_t* dst_b,
|
||||
int dst_stride_b,
|
||||
int width);
|
||||
void TransposeUVWx8_WASMSIMD(const uint8_t* src,
|
||||
int src_stride,
|
||||
uint8_t* dst_a,
|
||||
@ -321,13 +340,20 @@ 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,
|
||||
int src_stride,
|
||||
uint8_t* dst_a,
|
||||
int dst_stride_a,
|
||||
uint8_t* dst_b,
|
||||
int dst_stride_b,
|
||||
int width);
|
||||
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,
|
||||
uint8_t* dst_b,
|
||||
int dst_stride_b,
|
||||
int width);
|
||||
void TransposeUVWx8_Any_WASMSIMD(const uint8_t* src,
|
||||
int src_stride,
|
||||
uint8_t* dst_a,
|
||||
|
||||
@ -837,10 +837,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
|
||||
@ -852,6 +857,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
|
||||
@ -861,7 +867,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
|
||||
@ -871,13 +882,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
|
||||
@ -1675,6 +1693,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,
|
||||
@ -1797,10 +1821,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,
|
||||
@ -2615,16 +2647,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,
|
||||
@ -2775,6 +2822,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,
|
||||
@ -2850,6 +2901,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,
|
||||
@ -2874,6 +2929,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,
|
||||
@ -3019,6 +3078,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,
|
||||
@ -3043,6 +3106,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,
|
||||
@ -3953,6 +4020,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);
|
||||
@ -3971,6 +4041,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);
|
||||
@ -4000,16 +4073,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,
|
||||
@ -4438,6 +4515,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,
|
||||
@ -4450,6 +4528,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,
|
||||
@ -5400,6 +5481,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,
|
||||
@ -5420,6 +5505,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,
|
||||
@ -5434,10 +5523,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,
|
||||
@ -5982,6 +6079,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,
|
||||
@ -6103,10 +6206,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,
|
||||
@ -6632,6 +6743,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,
|
||||
@ -6667,6 +6782,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,
|
||||
@ -6781,6 +6901,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,
|
||||
@ -6801,6 +6926,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,
|
||||
@ -6877,6 +7007,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,
|
||||
@ -6893,6 +7027,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,
|
||||
@ -6909,6 +7047,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,
|
||||
@ -6921,6 +7063,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,
|
||||
@ -6933,6 +7079,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,
|
||||
@ -6945,6 +7095,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,
|
||||
@ -7005,10 +7159,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,
|
||||
|
||||
@ -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,6 +2596,16 @@ int UYVYToI420(const uint8_t* src_uyvy,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_UYVYTOYROW_LASX)
|
||||
if (TestCpuFlag(kCpuHasLASX)) {
|
||||
UYVYToYRow = UYVYToYRow_Any_LASX;
|
||||
UYVYToUVRow = UYVYToUVRow_Any_LASX;
|
||||
if (IS_ALIGNED(width, 32)) {
|
||||
UYVYToYRow = UYVYToYRow_LASX;
|
||||
UYVYToUVRow = UYVYToUVRow_LASX;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_UYVYTOYROW_LSX)
|
||||
if (TestCpuFlag(kCpuHasLSX)) {
|
||||
UYVYToYRow = UYVYToYRow_Any_LSX;
|
||||
@ -2851,7 +2893,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;
|
||||
}
|
||||
}
|
||||
@ -2859,7 +2901,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;
|
||||
}
|
||||
}
|
||||
@ -3083,7 +3125,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;
|
||||
}
|
||||
}
|
||||
@ -3091,7 +3133,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;
|
||||
}
|
||||
}
|
||||
@ -3200,8 +3242,14 @@ int ARGBToI420Alpha(const uint8_t* src_argb,
|
||||
#endif
|
||||
#if defined(HAS_ARGBEXTRACTALPHAROW_LSX)
|
||||
if (TestCpuFlag(kCpuHasLSX)) {
|
||||
ARGBExtractAlphaRow = IS_ALIGNED(width, 16) ? ARGBExtractAlphaRow_LSX
|
||||
: ARGBExtractAlphaRow_Any_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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -640,11 +640,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;
|
||||
@ -2450,7 +2458,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;
|
||||
}
|
||||
}
|
||||
@ -2500,7 +2508,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;
|
||||
}
|
||||
}
|
||||
@ -2508,7 +2516,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;
|
||||
}
|
||||
}
|
||||
@ -2612,7 +2620,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;
|
||||
}
|
||||
}
|
||||
@ -2662,7 +2670,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;
|
||||
}
|
||||
}
|
||||
@ -2670,7 +2678,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;
|
||||
}
|
||||
}
|
||||
@ -2806,7 +2814,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;
|
||||
}
|
||||
}
|
||||
@ -2814,7 +2822,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;
|
||||
}
|
||||
}
|
||||
@ -3065,7 +3073,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;
|
||||
}
|
||||
}
|
||||
@ -3073,7 +3081,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;
|
||||
}
|
||||
}
|
||||
@ -3197,7 +3205,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;
|
||||
}
|
||||
}
|
||||
@ -3205,7 +3213,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;
|
||||
}
|
||||
}
|
||||
@ -3327,7 +3335,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;
|
||||
}
|
||||
}
|
||||
@ -3335,7 +3343,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;
|
||||
}
|
||||
}
|
||||
@ -3423,11 +3431,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;
|
||||
@ -3509,11 +3525,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;
|
||||
@ -4130,7 +4154,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;
|
||||
}
|
||||
}
|
||||
@ -4138,7 +4162,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;
|
||||
}
|
||||
}
|
||||
@ -4213,7 +4237,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;
|
||||
}
|
||||
}
|
||||
@ -4221,7 +4245,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;
|
||||
}
|
||||
}
|
||||
@ -4291,7 +4315,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;
|
||||
}
|
||||
}
|
||||
@ -4299,7 +4323,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;
|
||||
}
|
||||
}
|
||||
@ -5156,6 +5180,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);
|
||||
@ -5248,6 +5280,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);
|
||||
@ -5466,7 +5506,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;
|
||||
}
|
||||
}
|
||||
@ -5474,7 +5514,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;
|
||||
}
|
||||
}
|
||||
@ -5698,7 +5738,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;
|
||||
}
|
||||
}
|
||||
@ -5706,7 +5746,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;
|
||||
}
|
||||
}
|
||||
@ -5841,7 +5881,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;
|
||||
}
|
||||
}
|
||||
@ -5849,7 +5889,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;
|
||||
}
|
||||
}
|
||||
@ -6072,7 +6112,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;
|
||||
}
|
||||
}
|
||||
@ -6080,7 +6120,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;
|
||||
}
|
||||
}
|
||||
@ -6209,7 +6249,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;
|
||||
}
|
||||
}
|
||||
@ -6217,7 +6257,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;
|
||||
}
|
||||
}
|
||||
@ -6308,7 +6348,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;
|
||||
}
|
||||
}
|
||||
@ -6316,7 +6356,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;
|
||||
}
|
||||
}
|
||||
@ -6409,7 +6449,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;
|
||||
}
|
||||
}
|
||||
@ -6417,7 +6457,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;
|
||||
}
|
||||
}
|
||||
@ -6568,7 +6608,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;
|
||||
}
|
||||
}
|
||||
@ -6576,7 +6616,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;
|
||||
}
|
||||
}
|
||||
@ -6701,7 +6741,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;
|
||||
}
|
||||
}
|
||||
@ -6709,7 +6749,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;
|
||||
}
|
||||
}
|
||||
@ -6759,7 +6799,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;
|
||||
}
|
||||
}
|
||||
@ -6767,7 +6807,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;
|
||||
}
|
||||
}
|
||||
@ -7971,7 +8011,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;
|
||||
}
|
||||
}
|
||||
@ -7979,7 +8019,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;
|
||||
}
|
||||
}
|
||||
@ -8191,7 +8231,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;
|
||||
}
|
||||
}
|
||||
@ -8199,7 +8239,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;
|
||||
}
|
||||
}
|
||||
@ -8363,7 +8403,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;
|
||||
}
|
||||
}
|
||||
@ -8371,7 +8411,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;
|
||||
}
|
||||
}
|
||||
@ -8557,7 +8597,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;
|
||||
}
|
||||
}
|
||||
@ -8565,7 +8605,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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -652,6 +652,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;
|
||||
@ -778,7 +786,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;
|
||||
}
|
||||
}
|
||||
@ -786,7 +794,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;
|
||||
}
|
||||
}
|
||||
@ -931,6 +939,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;
|
||||
@ -1051,7 +1067,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;
|
||||
}
|
||||
}
|
||||
@ -1059,7 +1075,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;
|
||||
}
|
||||
}
|
||||
@ -1193,6 +1209,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;
|
||||
@ -1301,7 +1325,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;
|
||||
}
|
||||
}
|
||||
@ -1309,7 +1333,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;
|
||||
}
|
||||
}
|
||||
@ -1449,6 +1473,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;
|
||||
@ -2008,7 +2040,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;
|
||||
}
|
||||
}
|
||||
@ -2016,7 +2048,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;
|
||||
}
|
||||
}
|
||||
@ -2247,6 +2279,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;
|
||||
@ -2406,7 +2446,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;
|
||||
}
|
||||
}
|
||||
@ -2414,7 +2454,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;
|
||||
}
|
||||
}
|
||||
@ -2645,6 +2685,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;
|
||||
@ -2789,7 +2837,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;
|
||||
}
|
||||
}
|
||||
@ -2797,7 +2845,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;
|
||||
}
|
||||
}
|
||||
@ -3017,6 +3065,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;
|
||||
@ -3429,7 +3485,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;
|
||||
}
|
||||
}
|
||||
@ -3437,7 +3493,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;
|
||||
}
|
||||
}
|
||||
@ -3517,6 +3573,14 @@ int ARGBToRGB565(const uint8_t* src_argb,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(HAS_ARGBTORGB565ROW_LASX)
|
||||
if (TestCpuFlag(kCpuHasLASX)) {
|
||||
ARGBToRGB565Row = ARGBToRGB565Row_Any_LASX;
|
||||
if (IS_ALIGNED(width, 16)) {
|
||||
ARGBToRGB565Row = ARGBToRGB565Row_LASX;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAS_ARGBTORGB565ROW_LASX)
|
||||
if (TestCpuFlag(kCpuHasLASX)) {
|
||||
@ -4258,6 +4322,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;
|
||||
|
||||
@ -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;
|
||||
@ -2661,6 +2677,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);
|
||||
@ -2725,7 +2749,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;
|
||||
}
|
||||
}
|
||||
@ -2733,7 +2757,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;
|
||||
}
|
||||
}
|
||||
@ -3002,7 +3026,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;
|
||||
}
|
||||
}
|
||||
@ -3010,7 +3034,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;
|
||||
}
|
||||
}
|
||||
@ -3141,11 +3165,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;
|
||||
@ -3855,6 +3887,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) {
|
||||
@ -3946,6 +3986,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) {
|
||||
@ -4021,7 +4069,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;
|
||||
}
|
||||
}
|
||||
@ -4029,7 +4077,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;
|
||||
}
|
||||
}
|
||||
@ -4315,9 +4363,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);
|
||||
@ -4480,9 +4533,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);
|
||||
@ -4783,11 +4841,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;
|
||||
@ -5016,7 +5082,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;
|
||||
}
|
||||
}
|
||||
@ -5024,7 +5090,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;
|
||||
}
|
||||
}
|
||||
@ -5278,7 +5344,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;
|
||||
}
|
||||
}
|
||||
@ -5286,7 +5352,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;
|
||||
}
|
||||
}
|
||||
@ -5404,10 +5470,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);
|
||||
@ -5442,10 +5516,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);
|
||||
@ -5481,10 +5563,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);
|
||||
@ -5611,11 +5701,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);
|
||||
@ -5794,8 +5892,14 @@ int ARGBExtractAlpha(const uint8_t* src_argb,
|
||||
#endif
|
||||
#if defined(HAS_ARGBEXTRACTALPHAROW_LSX)
|
||||
if (TestCpuFlag(kCpuHasLSX)) {
|
||||
ARGBExtractAlphaRow = IS_ALIGNED(width, 16) ? ARGBExtractAlphaRow_LSX
|
||||
: ARGBExtractAlphaRow_Any_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)
|
||||
@ -6065,11 +6169,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;
|
||||
@ -6110,11 +6222,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;
|
||||
|
||||
@ -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);
|
||||
@ -225,7 +233,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;
|
||||
}
|
||||
}
|
||||
@ -233,7 +241,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;
|
||||
}
|
||||
}
|
||||
@ -288,12 +296,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
|
||||
|
||||
@ -327,26 +335,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
|
||||
@ -410,7 +420,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) {
|
||||
@ -423,7 +433,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,
|
||||
@ -433,7 +442,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,
|
||||
@ -504,10 +512,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;
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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); \
|
||||
}
|
||||
void TransposeWx8_LSX(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"
|
||||
"addi.d %[src], %[src], 16 \n"
|
||||
|
||||
#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); \
|
||||
}
|
||||
"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"
|
||||
|
||||
#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); \
|
||||
}
|
||||
"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"
|
||||
|
||||
#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); \
|
||||
}
|
||||
"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"
|
||||
|
||||
#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,
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
"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,
|
||||
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;
|
||||
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) {
|
||||
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
|
||||
|
||||
@ -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
|
||||
|
||||
4912
source/row_lasx.cc
4912
source/row_lasx.cc
File diff suppressed because it is too large
Load Diff
5044
source/row_lsx.cc
5044
source/row_lsx.cc
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
@ -1155,11 +1155,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;
|
||||
@ -1190,7 +1198,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;
|
||||
}
|
||||
}
|
||||
@ -1423,7 +1431,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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
1313
source/scale_lsx.cc
1313
source/scale_lsx.cc
File diff suppressed because it is too large
Load Diff
@ -547,11 +547,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;
|
||||
@ -678,6 +686,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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user