diff --git a/CMakeLists.txt b/CMakeLists.txt index 9be715ce7d..da74a2536f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,6 +169,8 @@ if( CMAKE_C_COMPILER_ID MATCHES "MSVC") # This avoids conflicts with the C++ standard library. /DNOMINMAX ) + set(WIRESHARK_SIMD_TESTS + ) if(NOT WIN64) set(LOCAL_CFLAGS ${LOCAL_CFLAGS} "/D_BIND_TO_CURRENT_CRT_VERSION=1") @@ -313,6 +315,18 @@ else() set(WIRESHARK_CPP_ONLY_FLAGS ${WIRESHARK_CPP_ONLY_FLAGS} ${WIRESHARK_EXTRA_COMPILER_CPP_ONLY_FLAGS}) endif() + set(WIRESHARK_SIMD_TESTS + -faltivec + -mmmx + -msse + -msse2 + -msse3 + -mssse3 + -msse4.1 + -msse4.2 + -mavx + ) + add_definitions( -DG_DISABLE_DEPRECATED -DG_DISABLE_SINGLE_INCLUDES @@ -361,6 +375,23 @@ foreach(THIS_FLAG ${CPP_FLAG_TESTS}) endforeach() message(STATUS "C-Flags: ${CMAKE_C_FLAGS}\nCXX-Flags: ${CMAKE_CXX_FLAGS}") +foreach(THIS_FLAG ${WIRESHARK_SIMD_TESTS}) + string( REGEX REPLACE "[^a-zA-Z0-9_]+" "_" F ${THIS_FLAG} ) + set(${F} ${THIS_FLAG}) + set(V C_${F}_VALID) + message(STATUS "Checking for c-compiler SIMD flag: ${THIS_FLAG}") + check_c_compiler_flag(${${F}} ${V}) + if (${${V}}) + set(WIRESHARK_SIMD_FLAGS "${WIRESHARK_SIMD_FLAGS} ${${F}}") + endif() +endforeach() + +string(REGEX MATCH -msse4.2 + HAVE_SSE4_2 + ${WIRESHARK_SIMD_FLAGS} +) +message( STATUS "HAVE_SSE4_2: ${HAVE_SSE4_2}" ) + check_c_compiler_flag(-fvisibility=hidden FVHIDDEN) if(FVHIDDEN) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden") diff --git a/cmakeconfig.h.in b/cmakeconfig.h.in index a809e77147..aa2acbc469 100644 --- a/cmakeconfig.h.in +++ b/cmakeconfig.h.in @@ -15,6 +15,9 @@ /* Directory for data */ #define DATAFILE_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/${CPACK_PACKAGE_NAME}" +/* Build wsutil with SIMD optimization */ +#cmakedefine HAVE_SSE4_2 1 + /* Path to Python. */ #cmakedefine PYTHON_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DATADIR}/${CPACK_PACKAGE_NAME}/python/${CPACK_PACKAGE_VERSION}" diff --git a/wsutil/CMakeLists.txt b/wsutil/CMakeLists.txt index c6090e6701..ab4dfd83cc 100644 --- a/wsutil/CMakeLists.txt +++ b/wsutil/CMakeLists.txt @@ -21,7 +21,7 @@ include(UseABICheck) -IF(WIN32) +if(WIN32) set(WSUTIL_PLATFORM_FILES file_util.c inet_aton.c @@ -32,6 +32,12 @@ IF(WIN32) ) ENDIF(WIN32) +if(HAVE_SSE4_2) + set( WSUTIL_SSE42_FILES + ws_mempbrk_sse42.c + ) +endif() + set(WSUTIL_FILES adler32.c aes.c @@ -76,6 +82,7 @@ set(WSUTIL_FILES nghttp2/nghttp2_hd_huffman_data.c nghttp2/nghttp2_helper.c ${WSUTIL_PLATFORM_FILES} + ${WSUTIL_SSE42_FILES} ) set(wsutil_LIBS @@ -99,6 +106,13 @@ if (WERROR) COMPILE_FLAGS -Werror ) endif() +if (HAVE_SSE4_2) + set_source_files_properties( + ${WSUTIL_SSE42_FILES} + PROPERTIES + COMPILE_FLAGS -msse4.2 + ) +endif() add_library(wsutil ${LINK_MODE_LIB} ${WSUTIL_FILES}