From: Vladislav Shchapov Date: Tue, 10 Jun 2025 11:46:36 +0000 (+0500) Subject: Add LoongArch64 check for LSX, LASX features X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a26ca25a704b3f2cfed6ad41c060935bc2e5316b;p=thirdparty%2Fzlib-ng.git Add LoongArch64 check for LSX, LASX features Signed-off-by: Vladislav Shchapov --- diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index e3c4d5e2..01366e40 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -310,6 +310,14 @@ jobs: cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-riscv-clang.cmake packages: qemu-user crossbuild-essential-riscv64 + - name: Ubuntu GCC 14 LoongArch64 LSX + os: ubuntu-latest + cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-loongarch64-gcc-14.cmake -DWITH_BENCHMARKS=ON -DWITH_LASX=OFF + packages: qemu-user gcc-14-loongarch64-linux-gnu g++-14-loongarch64-linux-gnu libc-dev-loong64-cross + ldflags: -static + gcov-exec: loongarch64-linux-gnu-gcov-14 + codecov: ubuntu_gcc14_loongarch64_lsx + - name: Ubuntu GCC 14 LoongArch64 os: ubuntu-latest cmake-args: -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-loongarch64-gcc-14.cmake -DWITH_BENCHMARKS=ON diff --git a/CMakeLists.txt b/CMakeLists.txt index 3af5b154..fcb2416c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,6 +131,8 @@ elseif(BASEARCH_S360_FOUND) option(WITH_CRC32_VX "Build with vectorized CRC32 on IBM Z" ON) elseif(BASEARCH_LOONGARCH_FOUND) option(WITH_CRC32_LA "Build with vectorized CRC32 on LoongArch" ON) + option(WITH_LSX "Build with vectorized LSX on LoongArch" ON) + cmake_dependent_option(WITH_LASX "Build with vectorized LASX on LoongArch" ON "WITH_LSX" OFF) elseif(BASEARCH_X86_FOUND) option(WITH_SSE2 "Build with SSE2" ON) cmake_dependent_option(WITH_SSSE3 "Build with SSSE3" ON "WITH_SSE2" OFF) @@ -163,6 +165,8 @@ mark_as_advanced(FORCE WITH_RVV WITH_RISCV_ZBC WITH_CRC32_LA + WITH_LSX + WITH_LASX WITH_INFLATE_STRICT WITH_INFLATE_ALLOW_INVALID_DIST INSTALL_UTILS @@ -1028,6 +1032,31 @@ if(WITH_OPTIM) set(WITH_CRC32_LA OFF) endif() endif() + + if(WITH_LSX) + check_lsx_intrinsics() + if(HAVE_LSX_INTRIN) + add_definitions(-DLOONGARCH_LSX) + #set(LSX_SRCS ${ARCHDIR}/) + #list(APPEND ZLIB_ARCH_SRCS ${LSX_SRCS}) + #set_property(SOURCE ${LSX_SRCS} PROPERTY COMPILE_FLAGS "${LSXFLAG} ${NOLTOFLAG}") + else() + set(HAVE_LSX_INTRIN OFF) + endif() + endif() + + if(WITH_LASX) + check_lasx_intrinsics() + if(HAVE_LASX_INTRIN AND HAVE_LSX_INTRIN) + add_definitions(-DLOONGARCH_LASX) + #set(LASX_SRCS ${ARCHDIR}/) + #list(APPEND ZLIB_ARCH_SRCS ${LASX_SRCS}) + #set_property(SOURCE ${LASX_SRCS} PROPERTY COMPILE_FLAGS "${LASXFLAG} ${NOLTOFLAG}") + else() + set(HAVE_LASX_INTRIN OFF) + endif() + endif() + elseif(BASEARCH_X86_FOUND) add_definitions(-DX86_FEATURES) list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86_functions.h) @@ -1586,6 +1615,8 @@ elseif(BASEARCH_S360_FOUND) add_feature_info(WITH_CRC32_VX WITH_CRC32_VX "Build with vectorized CRC32 on IBM Z") elseif(BASEARCH_LOONGARCH_FOUND) add_feature_info(WITH_CRC32_LA WITH_CRC32_LA "Build with vectorized CRC32 on LoongArch") + add_feature_info(WITH_LSX WITH_LSX "Build with vectorized LSX on LoongArch") + add_feature_info(WITH_LASX WITH_LASX "Build with vectorized LASX on LoongArch") elseif(BASEARCH_X86_FOUND) add_feature_info(WITH_AVX2 WITH_AVX2 "Build with AVX2") add_feature_info(WITH_AVX512 WITH_AVX512 "Build with AVX512") diff --git a/arch/loongarch/Makefile.in b/arch/loongarch/Makefile.in index 6ffe50d7..c4d8252f 100644 --- a/arch/loongarch/Makefile.in +++ b/arch/loongarch/Makefile.in @@ -10,6 +10,9 @@ SFLAGS= INCLUDES= SUFFIX= +LSXFLAG=-mlsx +LASXFLAG=-mlasx + SRCDIR=. SRCTOP=../.. TOPDIR=$(SRCTOP) diff --git a/arch/loongarch/loongarch_features.c b/arch/loongarch/loongarch_features.c index a71dff6f..d044817e 100644 --- a/arch/loongarch/loongarch_features.c +++ b/arch/loongarch/loongarch_features.c @@ -15,9 +15,13 @@ * * Word number Bit number Annotation Implication * 0x1 25 CRC 1 indicates support for CRC instruction + * 0x1 6 LSX 1 indicates support for 128-bit vector extension + * 0x1 7 LASX 1 indicates support for 256-bit vector expansion */ void Z_INTERNAL loongarch_check_features(struct loongarch_cpu_features *features) { unsigned int w1 = __cpucfg(0x1); features->has_crc = w1 & 0x2000000; + features->has_lsx = w1 & 0x40; + features->has_lasx = w1 & 0x80; } diff --git a/arch/loongarch/loongarch_features.h b/arch/loongarch/loongarch_features.h index 2b1c1e21..27c90b14 100644 --- a/arch/loongarch/loongarch_features.h +++ b/arch/loongarch/loongarch_features.h @@ -10,6 +10,8 @@ struct loongarch_cpu_features { int has_crc; + int has_lsx; + int has_lasx; }; void Z_INTERNAL loongarch_check_features(struct loongarch_cpu_features *features); diff --git a/arch/loongarch/loongarch_functions.h b/arch/loongarch/loongarch_functions.h index 23d66a0d..9e10ffb1 100644 --- a/arch/loongarch/loongarch_functions.h +++ b/arch/loongarch/loongarch_functions.h @@ -18,6 +18,10 @@ uint32_t crc32_loongarch64(uint32_t crc, const uint8_t *buf, size_t len); # undef native_crc32 # define native_crc32 crc32_loongarch64 # endif +# if defined(LOONGARCH_LSX) && defined(__loongarch_sx) +# endif +# if defined(LOONGARCH_LASX) && defined(__loongarch_asx) +# endif #endif #endif /* LOONGARCH_FUNCTIONS_H_ */ diff --git a/cmake/detect-intrinsics.cmake b/cmake/detect-intrinsics.cmake index d71b5416..484966e9 100644 --- a/cmake/detect-intrinsics.cmake +++ b/cmake/detect-intrinsics.cmake @@ -690,3 +690,37 @@ macro(check_la64_crc_intrinsics) HAVE_LA64_CRC_INTRIN) set(CMAKE_REQUIRED_FLAGS) endmacro() + +macro(check_lsx_intrinsics) + if(NOT NATIVEFLAG) + set(LSXFLAG "-mlsx") + endif() + # Check whether compiler supports LSX intrinsics + set(CMAKE_REQUIRED_FLAGS "${LSXFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}") + check_c_source_compiles( + "#include + __m128i f(__m128i a, __m128i b) { + return __lsx_vabsd_b(a, b); + } + int main(void) { return 0; }" + HAVE_LSX_INTRIN + ) + set(CMAKE_REQUIRED_FLAGS) +endmacro() + +macro(check_lasx_intrinsics) + if(NOT NATIVEFLAG) + set(LASXFLAG "-mlasx") + endif() + # Check whether compiler supports LASX intrinsics + set(CMAKE_REQUIRED_FLAGS "${LASXFLAG} ${NATIVEFLAG} ${ZNOLTOFLAG}") + check_c_source_compiles( + "#include + __m256i f(__m256i a, __m256i b) { + return __lasx_xvabsd_b(a, b); + } + int main(void) { return 0; }" + HAVE_LASX_INTRIN + ) + set(CMAKE_REQUIRED_FLAGS) +endmacro() diff --git a/configure b/configure index ba92eff6..48ee775e 100755 --- a/configure +++ b/configure @@ -119,6 +119,8 @@ sse42flag="-msse4.2" pclmulflag="-mpclmul" vpclmulflag="-mvpclmulqdq -mavx512f" xsaveflag="-mxsave" +lsxflag="-mlsx" +lasxflag="-mlasx" armv8flag= neonflag= rvvflag= @@ -1733,6 +1735,42 @@ EOF fi } +check_lsx_intrinsics() { + # Check whether compiler supports LSX intrinsics + cat > $test.c << EOF +#include +__m128i f(__m128i a, __m128i b) { + return __lsx_vabsd_b(a, b); +} +int main(void) { return 0; } +EOF + if try ${CC} ${CFLAGS} ${lsxflag} $test.c; then + echo "Checking for LSX intrinsics ... Yes." | tee -a configure.log + HAVE_LSX_INTRIN=1 + else + echo "Checking for LSX intrinsics ... No." | tee -a configure.log + HAVE_LSX_INTRIN=0 + fi +} + +check_lasx_intrinsics() { + # Check whether compiler supports LASX intrinsics + cat > $test.c << EOF +#include +__m256i f(__m256i a, __m256i b) { + return __lasx_xvabsd_b(a, b); +} +int main(void) { return 0; } +EOF + if try ${CC} ${CFLAGS} ${lasxflag} $test.c; then + echo "Checking for LASX intrinsics ... Yes." | tee -a configure.log + HAVE_LASX_INTRIN=1 + else + echo "Checking for LASX intrinsics ... No." | tee -a configure.log + HAVE_LASX_INTRIN=0 + fi +} + check_rvv_compiler_flag() { cat > $test.c << EOF int main() { return 0; } @@ -2272,6 +2310,20 @@ EOF ARCH_SHARED_OBJS="${ARCH_SHARED_OBJS} crc32_la.lo" fi fi + + check_lsx_intrinsics + if test $HAVE_LSX_INTRIN -eq 1; then + CFLAGS="${CFLAGS} -DLOONGARCH_LSX" + SFLAGS="${SFLAGS} -DLOONGARCH_LSX" + + fi + + check_lasx_intrinsics + if test $HAVE_LASX_INTRIN -eq 1; then + CFLAGS="${CFLAGS} -DLOONGARCH_LASX" + SFLAGS="${SFLAGS} -DLOONGARCH_LASX" + + fi fi ;; @@ -2341,6 +2393,8 @@ echo xsaveflag = $xsaveflag >> configure.log echo armv8flag = $armv8flag >> configure.log echo neonflag = $neonflag >> configure.log echo armv6flag = $armv6flag >> configure.log +echo lsxflag = $lsxflag >> configure.log +echo lasxflag = $lasxflag >> configure.log echo ARCHDIR = ${ARCHDIR} >> configure.log echo ARCH_STATIC_OBJS = ${ARCH_STATIC_OBJS} >> configure.log echo ARCH_SHARED_OBJS = ${ARCH_SHARED_OBJS} >> configure.log @@ -2490,6 +2544,8 @@ sed < $SRCDIR/$ARCHDIR/Makefile.in " /^RVVFLAG *=/s#=.*#=$rvvflag# /^RVVZBCFLAG *=/s#=.*#=$rvvzbcflag# /^ZBCFLAG *=/s#=.*#=$zbcflag# +/^LSXFLAG *=/s#=.*#=$lsxflag# +/^LASXFLAG *=/s#=.*#=$lasxflag# " > $ARCHDIR/Makefile # Append header files dependencies.