@@ -379,7 +379,7 @@ if test "$enable_debug" = "yes"; then
379379 AX_CHECK_COMPILE_FLAG ( [ -ftrapv] , [ DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -ftrapv"] , [ ] , [ $CXXFLAG_WERROR] )
380380else
381381 dnl If not debugging, enable more aggressive optimizations for sphlib sources
382- AX_CHECK_COMPILE_FLAG ( [ -O3] , [ SPHLIB_CFLAGS ="$SPHLIB_CFLAGS -O3"] , [ ] , [ $CXXFLAG_WERROR] )
382+ AX_CHECK_COMPILE_FLAG ( [ -O3] , [ SPHLIB_FLAGS ="$SPHLIB_FLAGS -O3"] , [ ] , [ $CXXFLAG_WERROR] )
383383
384384 # We always enable at at least -g1 debug info to support proper stacktraces in crash infos
385385 # Stacktraces will be suboptimal due to optimization, but better than nothing. Also, -fno-omit-frame-pointer
@@ -535,21 +535,27 @@ dnl https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111843. To work around that, se
535535dnl -fstack-reuse=none for all gcc builds. (Only gcc understands this flag)
536536AX_CHECK_COMPILE_FLAG ( [ -fstack-reuse=none] , [ CORE_CXXFLAGS="$CORE_CXXFLAGS -fstack-reuse=none"] )
537537
538+ enable_arm_aes=no
538539enable_arm_crc=no
540+ enable_arm_neon=no
539541enable_arm_shani=no
542+ enable_ssse3=no
540543enable_sse42=no
541544enable_sse41=no
542545enable_avx2=no
546+ enable_x86_aesni=no
543547enable_x86_shani=no
544548
545549dnl Check for optional instruction set support. Enabling these does _not_ imply that all code will
546550dnl be compiled with them, rather that specific objects/libs may use them after checking for runtime
547551dnl compatibility.
548552
549553dnl x86
554+ AX_CHECK_COMPILE_FLAG ( [ -mssse3] , [ SSSE3_CXXFLAGS="-mssse3"] , [ ] , [ $CXXFLAG_WERROR] )
550555AX_CHECK_COMPILE_FLAG ( [ -msse4.2] , [ SSE42_CXXFLAGS="-msse4.2"] , [ ] , [ $CXXFLAG_WERROR] )
551556AX_CHECK_COMPILE_FLAG ( [ -msse4.1] , [ SSE41_CXXFLAGS="-msse4.1"] , [ ] , [ $CXXFLAG_WERROR] )
552557AX_CHECK_COMPILE_FLAG ( [ -mavx -mavx2] , [ AVX2_CXXFLAGS="-mavx -mavx2"] , [ ] , [ $CXXFLAG_WERROR] )
558+ AX_CHECK_COMPILE_FLAG ( [ -msse4.1 -maes] , [ X86_AESNI_CXXFLAGS="-msse4.1 -maes"] , [ ] , [ $CXXFLAG_WERROR] )
553559AX_CHECK_COMPILE_FLAG ( [ -msse4 -msha] , [ X86_SHANI_CXXFLAGS="-msse4 -msha"] , [ ] , [ $CXXFLAG_WERROR] )
554560
555561enable_clmul=
@@ -570,6 +576,20 @@ if test "$enable_clmul" = "yes"; then
570576 AC_DEFINE ( [ HAVE_CLMUL] , [ 1] , [ Define this symbol if clmul instructions can be used] )
571577fi
572578
579+ TEMP_CXXFLAGS="$CXXFLAGS"
580+ CXXFLAGS="$SSSE3_CXXFLAGS $CXXFLAGS"
581+ AC_MSG_CHECKING ( [ for SSSE3 intrinsics] )
582+ AC_COMPILE_IFELSE ( [ AC_LANG_PROGRAM ( [ [
583+ #include <tmmintrin.h>
584+ ] ] ,[ [
585+ __m64 x = _mm_abs_pi32(_m_from_int(0));
586+ return 0;
587+ ] ] ) ] ,
588+ [ AC_MSG_RESULT ( [ yes] ) ; enable_ssse3=yes; AC_DEFINE ( [ ENABLE_SSSE3] , [ 1] , [ Define this symbol to build code that uses SSSE3 intrinsics] ) ] ,
589+ [ AC_MSG_RESULT ( [ no] ) ]
590+ )
591+ CXXFLAGS="$TEMP_CXXFLAGS"
592+
573593TEMP_CXXFLAGS="$CXXFLAGS"
574594CXXFLAGS="$SSE42_CXXFLAGS $CXXFLAGS"
575595AC_MSG_CHECKING ( [ for SSE4.2 intrinsics] )
@@ -640,9 +660,41 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
640660)
641661CXXFLAGS="$TEMP_CXXFLAGS"
642662
663+ TEMP_CXXFLAGS="$CXXFLAGS"
664+ CXXFLAGS="$X86_AESNI_CXXFLAGS $CXXFLAGS"
665+ AC_MSG_CHECKING ( [ for x86 AES-NI intrinsics] )
666+ AC_COMPILE_IFELSE ( [ AC_LANG_PROGRAM ( [ [
667+ #include <stdint.h>
668+ #include <immintrin.h>
669+ #include <wmmintrin.h>
670+ ] ] ,[ [
671+ __m128i x = _mm_setzero_si128();
672+ x = _mm_aesenc_si128(x, _mm_setzero_si128());
673+ return _mm_extract_epi32(x, 0);
674+ ] ] ) ] ,
675+ [ AC_MSG_RESULT ( [ yes] ) ; enable_x86_aesni=yes; AC_DEFINE ( [ ENABLE_X86_AESNI] , [ 1] , [ Define this symbol to build code that uses x86 AES-NI intrinsics] ) ] ,
676+ [ AC_MSG_RESULT ( [ no] ) ]
677+ )
678+ CXXFLAGS="$TEMP_CXXFLAGS"
679+
643680# ARM
644681AX_CHECK_COMPILE_FLAG ( [ -march=armv8-a+crc+crypto] , [ ARM_CRC_CXXFLAGS="-march=armv8-a+crc+crypto"] , [ ] , [ $CXXFLAG_WERROR] )
645- AX_CHECK_COMPILE_FLAG ( [ -march=armv8-a+crypto] , [ ARM_SHANI_CXXFLAGS="-march=armv8-a+crypto"] , [ ] , [ $CXXFLAG_WERROR] )
682+ AX_CHECK_COMPILE_FLAG ( [ -march=armv8-a+crypto] , [ ARM_AES_CXXFLAGS="-march=armv8-a+crypto"; ARM_SHANI_CXXFLAGS="-march=armv8-a+crypto"] , [ ] , [ $CXXFLAG_WERROR] )
683+
684+ TEMP_CXXFLAGS="$CXXFLAGS"
685+ CXXFLAGS="$ARM_AES_CXXFLAGS $CXXFLAGS"
686+ AC_MSG_CHECKING ( [ for ARMv8 AES intrinsics] )
687+ AC_COMPILE_IFELSE ( [ AC_LANG_PROGRAM ( [ [
688+ #include <arm_neon.h>
689+ ] ] ,[ [
690+ uint8x16_t a, b;
691+ vaesmcq_u8(vaeseq_u8(a, b));
692+ return 0;
693+ ] ] ) ] ,
694+ [ AC_MSG_RESULT ( [ yes] ) ; enable_arm_aes=yes; AC_DEFINE ( [ ENABLE_ARM_AES] , [ 1] , [ Define this symbol to build code that uses ARMv8 AES intrinsics] ) ] ,
695+ [ AC_MSG_RESULT ( [ no] ) ]
696+ )
697+ CXXFLAGS="$TEMP_CXXFLAGS"
646698
647699TEMP_CXXFLAGS="$CXXFLAGS"
648700CXXFLAGS="$ARM_CRC_CXXFLAGS $CXXFLAGS"
@@ -663,6 +715,27 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
663715)
664716CXXFLAGS="$TEMP_CXXFLAGS"
665717
718+ ARM_NEON_CXXFLAGS=""
719+ TEMP_CXXFLAGS="$CXXFLAGS"
720+ for flag in "-march=armv8-a" "-march=armv7-a -mfpu=neon"; do
721+ AX_CHECK_COMPILE_FLAG ( [ $flag] , [
722+ CXXFLAGS="$CXXFLAGS $flag"
723+ AC_COMPILE_IFELSE ( [ AC_LANG_PROGRAM ( [ [
724+ #include <arm_neon.h>
725+ ] ] , [ [
726+ float32x4_t f = vdupq_n_f32(0.0);
727+ return 0;
728+ ] ] ) ] , [
729+ ARM_NEON_CXXFLAGS="$flag"
730+ enable_arm_neon=yes
731+ AC_DEFINE ( [ ENABLE_ARM_NEON] , [ 1] , [ Define this symbol to build code that uses ARM NEON intrinsics] )
732+ break
733+ ] )
734+ CXXFLAGS="$TEMP_CXXFLAGS"
735+ ] )
736+ done
737+ CXXFLAGS="$TEMP_CXXFLAGS"
738+
666739TEMP_CXXFLAGS="$CXXFLAGS"
667740CXXFLAGS="$ARM_SHANI_CXXFLAGS $CXXFLAGS"
668741AC_MSG_CHECKING ( [ for ARMv8 SHA-NI intrinsics] )
@@ -1820,11 +1893,15 @@ AM_CONDITIONAL([USE_QRCODE], [test "$use_qr" = "yes"])
18201893AM_CONDITIONAL([ USE_LCOV] , [ test "$use_lcov" = "yes"] )
18211894AM_CONDITIONAL([ USE_LIBEVENT] , [ test "$use_libevent" = "yes"] )
18221895AM_CONDITIONAL([ HARDEN] , [ test "$use_hardening" = "yes"] )
1896+ AM_CONDITIONAL([ ENABLE_SSSE3] , [ test "$enable_ssse3" = "yes"] )
18231897AM_CONDITIONAL([ ENABLE_SSE42] , [ test "$enable_sse42" = "yes"] )
18241898AM_CONDITIONAL([ ENABLE_SSE41] , [ test "$enable_sse41" = "yes"] )
18251899AM_CONDITIONAL([ ENABLE_AVX2] , [ test "$enable_avx2" = "yes"] )
1900+ AM_CONDITIONAL([ ENABLE_X86_AESNI] , [ test "$enable_x86_aesni" = "yes"] )
18261901AM_CONDITIONAL([ ENABLE_X86_SHANI] , [ test "$enable_x86_shani" = "yes"] )
1902+ AM_CONDITIONAL([ ENABLE_ARM_AES] , [ test "$enable_arm_aes" = "yes"] )
18271903AM_CONDITIONAL([ ENABLE_ARM_CRC] , [ test "$enable_arm_crc" = "yes"] )
1904+ AM_CONDITIONAL([ ENABLE_ARM_NEON] , [ test "$enable_arm_neon" = "yes"] )
18281905AM_CONDITIONAL([ ENABLE_ARM_SHANI] , [ test "$enable_arm_shani" = "yes"] )
18291906AM_CONDITIONAL([ WORDS_BIGENDIAN] , [ test "$ac_cv_c_bigendian" = "yes"] )
18301907AM_CONDITIONAL([ USE_NATPMP] , [ test "$use_natpmp" = "yes"] )
@@ -1877,13 +1954,17 @@ AC_SUBST(PIC_FLAGS)
18771954AC_SUBST ( PIE_FLAGS )
18781955AC_SUBST ( SANITIZER_CXXFLAGS )
18791956AC_SUBST ( SANITIZER_LDFLAGS )
1880- AC_SUBST ( SPHLIB_CFLAGS )
1957+ AC_SUBST ( SPHLIB_FLAGS )
1958+ AC_SUBST ( SSSE3_CXXFLAGS )
18811959AC_SUBST ( SSE42_CXXFLAGS )
18821960AC_SUBST ( SSE41_CXXFLAGS )
18831961AC_SUBST ( CLMUL_CXXFLAGS )
18841962AC_SUBST ( AVX2_CXXFLAGS )
1963+ AC_SUBST ( X86_AESNI_CXXFLAGS )
18851964AC_SUBST ( X86_SHANI_CXXFLAGS )
1965+ AC_SUBST ( ARM_AES_CXXFLAGS )
18861966AC_SUBST ( ARM_CRC_CXXFLAGS )
1967+ AC_SUBST ( ARM_NEON_CXXFLAGS )
18871968AC_SUBST ( ARM_SHANI_CXXFLAGS )
18881969AC_SUBST ( LIBTOOL_APP_LDFLAGS )
18891970AC_SUBST ( USE_SQLITE )
0 commit comments