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
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)
WITH_RVV
WITH_RISCV_ZBC
WITH_CRC32_LA
+ WITH_LSX
+ WITH_LASX
WITH_INFLATE_STRICT
WITH_INFLATE_ALLOW_INVALID_DIST
INSTALL_UTILS
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)
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")
INCLUDES=
SUFFIX=
+LSXFLAG=-mlsx
+LASXFLAG=-mlasx
+
SRCDIR=.
SRCTOP=../..
TOPDIR=$(SRCTOP)
*
* 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;
}
struct loongarch_cpu_features {
int has_crc;
+ int has_lsx;
+ int has_lasx;
};
void Z_INTERNAL loongarch_check_features(struct loongarch_cpu_features *features);
# 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_ */
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()
pclmulflag="-mpclmul"
vpclmulflag="-mvpclmulqdq -mavx512f"
xsaveflag="-mxsave"
+lsxflag="-mlsx"
+lasxflag="-mlasx"
armv8flag=
neonflag=
rvvflag=
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; }
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
;;
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
/^RVVFLAG *=/s#=.*#=$rvvflag#
/^RVVZBCFLAG *=/s#=.*#=$rvvzbcflag#
/^ZBCFLAG *=/s#=.*#=$zbcflag#
+/^LSXFLAG *=/s#=.*#=$lsxflag#
+/^LASXFLAG *=/s#=.*#=$lasxflag#
" > $ARCHDIR/Makefile
# Append header files dependencies.