RVV disable 64 bit elements and vcombine_v

Bug: 405451074
Change-Id: I8e4437be92934b3c367c94d867d7967c32747260
Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/6385788
Reviewed-by: Wan-Teh Chang <wtc@google.com>
This commit is contained in:
Frank Barchard 2025-03-25 11:54:02 -07:00
parent 0c07032182
commit 5f284054cb
6 changed files with 87 additions and 50 deletions

View File

@ -1,6 +1,6 @@
Name: libyuv Name: libyuv
URL: https://chromium.googlesource.com/libyuv/libyuv/ URL: https://chromium.googlesource.com/libyuv/libyuv/
Version: 1906 Version: 1907
License: BSD-3-Clause License: BSD-3-Clause
License File: LICENSE License File: LICENSE
Shipped: yes Shipped: yes

View File

@ -895,36 +895,73 @@ extern "C" {
#define HAS_RAWTOYJROW_LASX #define HAS_RAWTOYJROW_LASX
#endif #endif
#if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic >= 12000 && \
!defined(LIBYUV_DISABLE_RVV)
#define LIBYUV_DISABLE_RVV 1
#endif
#if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector) #if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector)
#if __riscv_v_intrinsic > 11000 #if defined(__riscv_v_intrinsic) && __riscv_v_intrinsic > 11000
// Since v0.12, TUPLE_TYPE is introduced for segment load and store. // Since v0.12, TUPLE_TYPE is introduced for segment load and store.
#define LIBYUV_RVV_HAS_TUPLE_TYPE #define LIBYUV_RVV_HAS_TUPLE_TYPE
// Since v0.12, VXRM(fixed-point rounding mode) is included in arguments of // Since v0.12, VXRM(fixed-point rounding mode) is included in arguments of
// fixed-point intrinsics. // fixed-point intrinsics.
#define LIBYUV_RVV_HAS_VXRM_ARG #define LIBYUV_RVV_HAS_VXRM_ARG
#endif #endif
#endif
#define HAS_COPYROW_RVV // The following are available for RVV 1.2
#define HAS_AB64TOARGBROW_RVV #if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector)
#define HAS_ABGRTOYJROW_RVV #define HAS_ABGRTOYJROW_RVV
#define HAS_ABGRTOYROW_RVV #define HAS_ABGRTOYROW_RVV
#define HAS_AR64TOARGBROW_RVV #define HAS_AR64TOARGBROW_RVV
#define HAS_AR64TOAB64ROW_RVV
#define HAS_ARGBATTENUATEROW_RVV
#define HAS_ARGBBLENDROW_RVV
#define HAS_ARGBCOPYYTOALPHAROW_RVV #define HAS_ARGBCOPYYTOALPHAROW_RVV
#define HAS_ARGBEXTRACTALPHAROW_RVV #define HAS_ARGBEXTRACTALPHAROW_RVV
#define HAS_ARGBTOAB64ROW_RVV
#define HAS_ARGBTOABGRROW_RVV
#define HAS_ARGBTOAR64ROW_RVV #define HAS_ARGBTOAR64ROW_RVV
#define HAS_ARGBTOBGRAROW_RVV
#define HAS_ARGBTORAWROW_RVV
#define HAS_ARGBTORGB24ROW_RVV
#define HAS_ARGBTORGBAROW_RVV
#define HAS_ARGBTOYJROW_RVV #define HAS_ARGBTOYJROW_RVV
#define HAS_ARGBTOYMATRIXROW_RVV #define HAS_ARGBTOYMATRIXROW_RVV
#define HAS_ARGBTOYROW_RVV #define HAS_ARGBTOYROW_RVV
#define HAS_BGRATOYROW_RVV #define HAS_BGRATOYROW_RVV
#define HAS_COPYROW_RVV
#define HAS_INTERPOLATEROW_RVV
#define HAS_RAWTOYJROW_RVV
#define HAS_RAWTOYROW_RVV
#define HAS_RGB24TOYJROW_RVV
#define HAS_RGB24TOYROW_RVV
#define HAS_RGBATOYJROW_RVV
#define HAS_RGBATOYMATRIXROW_RVV
#define HAS_RGBATOYROW_RVV
#define HAS_RGBTOYMATRIXROW_RVV
#define HAS_SPLITARGBROW_RVV
#define HAS_SPLITRGBROW_RVV
#define HAS_SPLITUVROW_RVV
#define HAS_SPLITXRGBROW_RVV
#endif
// The following are available for RVV 1.1
// TODO(fbarchard): Port to RVV 1.2 (tuple)
// missing support for vcreate_v:
// __riscv_vcreate_v_u16m2x2
// __riscv_vcreate_v_u16m2x4
// __riscv_vcreate_v_u16m4x2
// __riscv_vcreate_v_u8m1x3
// __riscv_vcreate_v_u8m1x4
// __riscv_vcreate_v_u8m2x2
// __riscv_vcreate_v_u8m2x3
// __riscv_vcreate_v_u8m2x4
// __riscv_vcreate_v_u8m4x2
#if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector) && \
!defined(LIBYUV_RVV_HAS_TUPLE_TYPE)
#define HAS_AB64TOARGBROW_RVV
#define HAS_AR64TOAB64ROW_RVV
#define HAS_ARGBATTENUATEROW_RVV
#define HAS_ARGBBLENDROW_RVV
#define HAS_ARGBTOAB64ROW_RVV
#define HAS_ARGBTOABGRROW_RVV
#define HAS_ARGBTOBGRAROW_RVV
#define HAS_ARGBTORAWROW_RVV
#define HAS_ARGBTORGB24ROW_RVV
#define HAS_ARGBTORGBAROW_RVV
#define HAS_BLENDPLANEROW_RVV #define HAS_BLENDPLANEROW_RVV
#define HAS_I400TOARGBROW_RVV #define HAS_I400TOARGBROW_RVV
#define HAS_I422ALPHATOARGBROW_RVV #define HAS_I422ALPHATOARGBROW_RVV
@ -934,7 +971,6 @@ extern "C" {
#define HAS_I444ALPHATOARGBROW_RVV #define HAS_I444ALPHATOARGBROW_RVV
#define HAS_I444TOARGBROW_RVV #define HAS_I444TOARGBROW_RVV
#define HAS_I444TORGB24ROW_RVV #define HAS_I444TORGB24ROW_RVV
#define HAS_INTERPOLATEROW_RVV
#define HAS_J400TOARGBROW_RVV #define HAS_J400TOARGBROW_RVV
#define HAS_MERGEARGBROW_RVV #define HAS_MERGEARGBROW_RVV
#define HAS_MERGERGBROW_RVV #define HAS_MERGERGBROW_RVV
@ -947,20 +983,8 @@ extern "C" {
#define HAS_RAWTOARGBROW_RVV #define HAS_RAWTOARGBROW_RVV
#define HAS_RAWTORGB24ROW_RVV #define HAS_RAWTORGB24ROW_RVV
#define HAS_RAWTORGBAROW_RVV #define HAS_RAWTORGBAROW_RVV
#define HAS_RAWTOYJROW_RVV
#define HAS_RAWTOYROW_RVV
#define HAS_RGB24TOARGBROW_RVV #define HAS_RGB24TOARGBROW_RVV
#define HAS_RGB24TOYJROW_RVV
#define HAS_RGB24TOYROW_RVV
#define HAS_RGBATOARGBROW_RVV #define HAS_RGBATOARGBROW_RVV
#define HAS_RGBATOYJROW_RVV
#define HAS_RGBATOYMATRIXROW_RVV
#define HAS_RGBATOYROW_RVV
#define HAS_RGBTOYMATRIXROW_RVV
#define HAS_SPLITARGBROW_RVV
#define HAS_SPLITRGBROW_RVV
#define HAS_SPLITUVROW_RVV
#define HAS_SPLITXRGBROW_RVV
#endif #endif
#if defined(_MSC_VER) && !defined(__CLR_VER) && !defined(__clang__) #if defined(_MSC_VER) && !defined(__CLR_VER) && !defined(__clang__)

View File

@ -162,39 +162,49 @@ extern "C" {
#define HAS_SCALEROWDOWN34_LSX #define HAS_SCALEROWDOWN34_LSX
#endif #endif
#if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector) // The following are available on RVV with 64 bit elements
#define HAS_SCALEADDROW_RVV // TODO: Update compiler to support 64 bit
// TODO: Test ScaleARGBRowDownEven_RVV and enable it #if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector) && \
// #define HAS_SCALEARGBROWDOWNEVEN_RVV defined(__riscv_zve64x)
#if defined(__riscv_zve64x)
#define HAS_SCALEUVROWDOWN4_RVV #define HAS_SCALEUVROWDOWN4_RVV
#endif
#define HAS_SCALEUVROWDOWNEVEN_RVV
#if __riscv_v_intrinsic == 11000
#define HAS_SCALEARGBFILTERCOLS_RVV
#endif
#define HAS_SCALEARGBROWDOWN2_RVV #define HAS_SCALEARGBROWDOWN2_RVV
#endif
// The following are available on RVV 1.1
// TODO: Port to RVV 1.2
#if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector) && \
defined(__riscv_v_intrinsic) && __riscv_v_intrinsic == 11000
#define HAS_SCALEROWDOWN34_0_BOX_RVV
#define HAS_SCALEROWDOWN34_1_BOX_RVV
#define HAS_SCALEROWDOWN38_2_BOX_RVV
#define HAS_SCALEROWDOWN38_3_BOX_RVV
#define HAS_SCALEUVROWUP2_BILINEAR_RVV
#define HAS_SCALEUVROWUP2_LINEAR_RVV
#define HAS_SCALEROWDOWN34_RVV
#define HAS_SCALEROWDOWN38_RVV
#define HAS_SCALEROWUP2_BILINEAR_RVV
#define HAS_SCALEROWUP2_LINEAR_RVV
#endif
// The following are available on RVV
#if !defined(LIBYUV_DISABLE_RVV) && defined(__riscv_vector) && \
defined(__riscv_v_intrinsic) && __riscv_v_intrinsic == 11000
#define HAS_SCALEARGBFILTERCOLS_RVV
#define HAS_SCALEARGBROWDOWN2BOX_RVV #define HAS_SCALEARGBROWDOWN2BOX_RVV
#define HAS_SCALEARGBROWDOWN2LINEAR_RVV #define HAS_SCALEARGBROWDOWN2LINEAR_RVV
#define HAS_SCALEARGBROWDOWNEVENBOX_RVV #define HAS_SCALEARGBROWDOWNEVENBOX_RVV
#define HAS_SCALEROWDOWN2_RVV
#define HAS_SCALEROWDOWN2BOX_RVV #define HAS_SCALEROWDOWN2BOX_RVV
#define HAS_SCALEADDROW_RVV
// TODO: Test ScaleARGBRowDownEven_RVV and enable it
// #define HAS_SCALEARGBROWDOWNEVEN_RVV
#define HAS_SCALEUVROWDOWNEVEN_RVV
#define HAS_SCALEROWDOWN2_RVV
#define HAS_SCALEROWDOWN2LINEAR_RVV #define HAS_SCALEROWDOWN2LINEAR_RVV
#define HAS_SCALEROWDOWN34_0_BOX_RVV
#define HAS_SCALEROWDOWN34_1_BOX_RVV
#define HAS_SCALEROWDOWN34_RVV
#define HAS_SCALEROWDOWN38_2_BOX_RVV
#define HAS_SCALEROWDOWN38_3_BOX_RVV
#define HAS_SCALEROWDOWN38_RVV
#define HAS_SCALEROWDOWN4_RVV #define HAS_SCALEROWDOWN4_RVV
#define HAS_SCALEROWDOWN4BOX_RVV #define HAS_SCALEROWDOWN4BOX_RVV
#define HAS_SCALEROWUP2_BILINEAR_RVV
#define HAS_SCALEROWUP2_LINEAR_RVV
#define HAS_SCALEUVROWDOWN2_RVV #define HAS_SCALEUVROWDOWN2_RVV
#define HAS_SCALEUVROWDOWN2BOX_RVV #define HAS_SCALEUVROWDOWN2BOX_RVV
#define HAS_SCALEUVROWDOWN2LINEAR_RVV #define HAS_SCALEUVROWDOWN2LINEAR_RVV
#define HAS_SCALEUVROWUP2_BILINEAR_RVV
#define HAS_SCALEUVROWUP2_LINEAR_RVV
#endif #endif
// Scale ARGB vertically with bilinear interpolation. // Scale ARGB vertically with bilinear interpolation.

View File

@ -11,6 +11,6 @@
#ifndef INCLUDE_LIBYUV_VERSION_H_ #ifndef INCLUDE_LIBYUV_VERSION_H_
#define INCLUDE_LIBYUV_VERSION_H_ #define INCLUDE_LIBYUV_VERSION_H_
#define LIBYUV_VERSION 1906 #define LIBYUV_VERSION 1907
#endif // INCLUDE_LIBYUV_VERSION_H_ #endif // INCLUDE_LIBYUV_VERSION_H_

View File

@ -139,7 +139,9 @@ static void ScaleARGBDown2(int src_width,
} }
} }
#endif #endif
#if defined(HAS_SCALEARGBROWDOWN2_RVV) #if defined(HAS_SCALEARGBROWDOWN2_RVV) && \
defined(HAS_SCALEARGBROWDOWN2LINEAR_RVV) && \
defined(HAS_SCALEARGBROWDOWN2BOX_RVV)
if (TestCpuFlag(kCpuHasRVV)) { if (TestCpuFlag(kCpuHasRVV)) {
ScaleARGBRowDown2 = ScaleARGBRowDown2 =
filtering == kFilterNone filtering == kFilterNone
@ -215,7 +217,7 @@ static int ScaleARGBDown4Box(int src_width,
ScaleARGBRowDown2 = ScaleARGBRowDown2Box_SME; ScaleARGBRowDown2 = ScaleARGBRowDown2Box_SME;
} }
#endif #endif
#if defined(HAS_SCALEARGBROWDOWN2_RVV) #if defined(HAS_SCALEARGBROWDOWN2BOX_RVV)
if (TestCpuFlag(kCpuHasRVV)) { if (TestCpuFlag(kCpuHasRVV)) {
ScaleARGBRowDown2 = ScaleARGBRowDown2Box_RVV; ScaleARGBRowDown2 = ScaleARGBRowDown2Box_RVV;
} }

View File

@ -95,6 +95,7 @@ void ScaleAddRow_RVV(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width) {
#endif #endif
#ifdef HAS_SCALEARGBROWDOWN2_RVV #ifdef HAS_SCALEARGBROWDOWN2_RVV
// TODO: Reimplement similar to linear with vlseg2 so u64 is not required
void ScaleARGBRowDown2_RVV(const uint8_t* src_argb, void ScaleARGBRowDown2_RVV(const uint8_t* src_argb,
ptrdiff_t src_stride, ptrdiff_t src_stride,
uint8_t* dst_argb, uint8_t* dst_argb,