From af1aaca84027a69ab25f251ade1bf1714b180d89 Mon Sep 17 00:00:00 2001 From: Frank Barchard Date: Thu, 3 Sep 2026 13:20:08 -0700 Subject: [PATCH] Enable RVV support in CMake and Bazel for RISC-V targets Enable RISC-V Vector (RVV) by default when building natively on RISC-V platforms (such as SpacemiT K1/K3) using CMake and Bazel: - CMakeLists.txt: Detect riscv64 and riscv32, probe compiler support for -march=rv64gcv / -march=rv32gcv, and append architecture flags with auto-vectorization disabled (-fno-vectorize -fno-slp-vectorize). Support custom architecture flags via -DRISCV_COMPILER_FLAGS and provide -DUSE_RVV=OFF to disable. - BUILD.bazel: Add RVV_COPTS for @platforms//cpu:riscv64 and @platforms//cpu:riscv32 with -fno-vectorize. - docs/getting_started.md: Document native SBC builds, custom targets (SiFive X280, Coral 32-bit Zve32x), Bazel, and Blaze commands. Test: cmake build on host and simulated riscv64; clang cross-compile tests Bug: none Change-Id: Iecb20b73b2934b6477e7e0c71b3539a8251e4e8b TAG=agy CONV=2f28dd8a-c892-4c29-8aed-606afd090398 Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8349493 Reviewed-by: richard winterton Commit-Queue: Frank Barchard --- BUILD.bazel | 16 +++++++++- CMakeLists.txt | 35 ++++++++++++++++++++ docs/getting_started.md | 71 ++++++++++++++++++++++++++++++++--------- 3 files changed, 106 insertions(+), 16 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index ad2cd3df2..00bf396a2 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -56,7 +56,21 @@ PLATFORM_COPTS = select({ "-DGOOGLE_COMMANDLINEFLAGS_FULL_API", ] -ALL_COPTS = PLATFORM_COPTS +RVV_COPTS = select({ + "@platforms//cpu:riscv64": [ + "-march=rv64gcv", + "-fno-vectorize", + "-fno-slp-vectorize", + ], + "@platforms//cpu:riscv32": [ + "-march=rv32gcv", + "-fno-vectorize", + "-fno-slp-vectorize", + ], + "//conditions:default": [], +}) + +ALL_COPTS = PLATFORM_COPTS + RVV_COPTS ALL_NEON_COPTS = NEON_COPTS + PLATFORM_COPTS diff --git a/CMakeLists.txt b/CMakeLists.txt index 37ff7a24d..17f6cbda9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -139,6 +139,41 @@ int main(void) { return 0; } add_definitions(-DLIBYUV_DISABLE_SME) endif() endif() + + if(arch_lowercase MATCHES "^riscv") + option(USE_RVV "Enable RISC-V Vector" ON) + if(USE_RVV) + if(NOT RISCV_COMPILER_FLAGS) + if(CMAKE_SIZEOF_VOID_P EQUAL 8 OR arch_lowercase STREQUAL "riscv64") + set(RISCV_COMPILER_FLAGS "-march=rv64gcv") + else() + set(RISCV_COMPILER_FLAGS "-march=rv32gcv") + endif() + endif() + + include(CheckCSourceCompiles) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(OLD_CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE}) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${RISCV_COMPILER_FLAGS}") + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + check_c_source_compiles(" +int main(void) { return 0; } + " CAN_COMPILE_RVV) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) + set(CMAKE_TRY_COMPILE_TARGET_TYPE ${OLD_CMAKE_TRY_COMPILE_TARGET_TYPE}) + + if(CAN_COMPILE_RVV) + if(NOT CMAKE_C_FLAGS MATCHES "-march=" AND NOT CMAKE_C_FLAGS MATCHES "-mcpu=") + set(CMAKE_C_FLAGS "${RISCV_COMPILER_FLAGS} -fno-vectorize -fno-slp-vectorize ${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS "${RISCV_COMPILER_FLAGS} -fno-vectorize -fno-slp-vectorize ${CMAKE_CXX_FLAGS}") + endif() + else() + add_definitions(-DLIBYUV_DISABLE_RVV) + endif() + else() + add_definitions(-DLIBYUV_DISABLE_RVV) + endif() + endif() endif() if(LOONGARCH64) diff --git a/docs/getting_started.md b/docs/getting_started.md index 06160bb20..d9807ae40 100644 --- a/docs/getting_started.md +++ b/docs/getting_started.md @@ -224,7 +224,61 @@ Install cmake: http://www.cmake.org/ ## Building RISC-V target with cmake -### Prerequisite: build risc-v clang toolchain and qemu +### Native build on RISC-V SBC (e.g. SpacemiT K1/K3) + +On a 64-bit RISC-V system, CMake automatically detects `riscv64` and enables +RVV with `-march=rv64gcv`: + + cmake -B out/Release -DCMAKE_BUILD_TYPE=Release -DUNIT_TEST=ON + cmake --build out/Release + +To build for 32-bit RISC-V targets: + + cmake -B out/Release -DCMAKE_BUILD_TYPE=Release -DRISCV_COMPILER_FLAGS="-march=rv32gcv" + cmake --build out/Release + +#### Customized Compiler Flags + +Customized compiler flags can be passed with `-DRISCV_COMPILER_FLAGS="xxx"`. +When assigned, the specified flags are used instead of the default `-march=rv64gcv`: + +Targeting SiFive X280: + + cmake -B out/Release -DUNIT_TEST=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DRISCV_COMPILER_FLAGS="-mcpu=sifive-x280" + +Targeting Coral (32-bit without floating point, Zve32x): + + cmake -B out/Release -DUNIT_TEST=ON \ + -DCMAKE_BUILD_TYPE=Release \ + -DRISCV_COMPILER_FLAGS="-march=rv32imac_zve32x" + +To disable RVV: + + cmake -B out/Release -DCMAKE_BUILD_TYPE=Release -DUSE_RVV=OFF + +### Building RISC-V with Bazel and Blaze + +To build with Bazel for 64-bit or 32-bit RISC-V targets: + + bazel test --platforms=@platforms//cpu:riscv64 //... + bazel test --platforms=@platforms//cpu:riscv32 //... + +For custom targets such as SiFive X280 or Coral: + + bazel test --platforms=@platforms//cpu:riscv64 --copt=-mcpu=sifive-x280 //... + bazel test --platforms=@platforms//cpu:riscv32 --copt=-march=rv32imac_zve32x //... + +In google3 using Blaze: + + blaze test --config=mpu64 //third_party/libyuv:libyuv_test + blaze run --config=mpu64 //third_party/libyuv:cpuid + blaze run --config=mpu64 //third_party/libyuv:yuvconvert + +### Cross-compile for RISC-V target using QEMU + +#### Prerequisite: build risc-v clang toolchain and qemu If you don't have prebuilt clang and riscv64 qemu, run the script to download source and build them. @@ -232,7 +286,7 @@ If you don't have prebuilt clang and riscv64 qemu, run the script to download so After running script, clang & qemu are built in `build-toolchain-qemu/riscv-clang/` & `build-toolchain-qemu/riscv-qemu/`. -### Cross-compile for RISC-V target +#### Cross-compile for RISC-V target cmake -B out/Release/ -DUNIT_TEST=ON \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_TOOLCHAIN_FILE="./riscv_script/riscv-clang.cmake" \ @@ -240,19 +294,6 @@ After running script, clang & qemu are built in `build-toolchain-qemu/riscv-clan -DUSE_RVV=ON . cmake --build out/Release/ -#### Customized Compiler Flags - -Customized compiler flags are supported by `-DRISCV_COMPILER_FLAGS="xxx"`. -If `-DRISCV_COMPILER_FLAGS="xxx"` is manually assigned, other compile flags(e.g disable -march=xxx) will not be appended. - -Example: - - cmake -B out/Release/ -DUNIT_TEST=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_TOOLCHAIN_FILE="./riscv_script/riscv-clang.cmake" \ - -DRISCV_COMPILER_FLAGS="-mcpu=sifive-x280" \ - . - ### Run on QEMU #### Run libyuv_unittest on QEMU