]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Add LoongArch64 check for LSX, LASX features
authorVladislav Shchapov <vladislav@shchapov.ru>
Tue, 10 Jun 2025 11:46:36 +0000 (16:46 +0500)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Fri, 11 Jul 2025 14:12:18 +0000 (16:12 +0200)
Signed-off-by: Vladislav Shchapov <vladislav@shchapov.ru>
.github/workflows/cmake.yml
CMakeLists.txt
arch/loongarch/Makefile.in
arch/loongarch/loongarch_features.c
arch/loongarch/loongarch_features.h
arch/loongarch/loongarch_functions.h
cmake/detect-intrinsics.cmake
configure

index e3c4d5e202eb3c620dfb0624fefa05fb05552b00..01366e409b8db5bf7532d06b19fd8bbd93baf7bb 100644 (file)
@@ -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
index 3af5b154be29d0f47fa29f8a46d6f91c970bbb85..fcb2416caa4cbc96816787605de5a7b51fd1e330 100644 (file)
@@ -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")
index 6ffe50d785d8c33ac04b897e77daa79a9ab090cd..c4d8252f54fccad64c89b359fd496b9f491c1102 100644 (file)
@@ -10,6 +10,9 @@ SFLAGS=
 INCLUDES=
 SUFFIX=
 
+LSXFLAG=-mlsx
+LASXFLAG=-mlasx
+
 SRCDIR=.
 SRCTOP=../..
 TOPDIR=$(SRCTOP)
index a71dff6fb57768f3abcc04c5e126179c442af670..d044817e5b7c28cfcebeb61883af40d7a893a6cf 100644 (file)
  *
  * 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;
 }
index 2b1c1e2142a547750d66737f36167aba63d011c9..27c90b14b3ed8440336ec70d454b24ac7a1ffd5a 100644 (file)
@@ -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);
index 23d66a0d123c653229a71c9ea627f5a586b4b239..9e10ffb10713811ddc889d6325c9085b431b8f39 100644 (file)
@@ -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_ */
index d71b5416d3c12d5b181130343ba693eecc936abd..484966e9f77160e9c64bc67043112e3800f004e7 100644 (file)
@@ -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 <lsxintrin.h>
+        __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 <lasxintrin.h>
+        __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()
index ba92eff685f21a847e898c9be215cebb09812803..48ee775e7b11a987ade17277d3156429831a1928 100755 (executable)
--- 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 <lsxintrin.h>
+__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 <lasxintrin.h>
+__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.