aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Mayer <jmayer@loplof.de>2014-06-13 17:59:02 +0200
committerJörg Mayer <jmayer@loplof.de>2014-06-14 06:44:15 +0000
commit935280317a88223312709e93d428e586a6cce9ef (patch)
tree954fac9628b29701a039b8f6e6cc70e69e24d6ae
parenta4a7d2cfec9a1ac89a5d9c2ae130721fdc5bad9b (diff)
Backport autofoo simd optimization
Change-Id: I5d58154bf8266eabedf550b54f18845612f514c6 Reviewed-on: https://code.wireshark.org/review/2206 Reviewed-by: Jörg Mayer <jmayer@loplof.de>
-rw-r--r--CMakeLists.txt31
-rw-r--r--cmakeconfig.h.in3
-rw-r--r--wsutil/CMakeLists.txt16
3 files changed, 49 insertions, 1 deletions
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}