Skip to content

Commit

Permalink
Modularized the simd flags so they can be used individually by files …
Browse files Browse the repository at this point in the history
…that need specific flags in various combinations.
  • Loading branch information
JonathanHenson committed Jan 22, 2024
1 parent 901405e commit 11e0c23
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 23 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE -DCJSON_HIDE_SYMBOLS)

if (AWS_HAVE_AVX2_INTRINSICS)
target_compile_definitions(${PROJECT_NAME} PRIVATE -DUSE_SIMD_ENCODING)
simd_add_source_avx(${PROJECT_NAME} "source/arch/intel/encoding_avx2.c")
simd_append_source_avx2(${PROJECT_NAME} "source/arch/intel/encoding_avx2.c")
message(STATUS "Building SIMD base64 decoder")
endif()

Expand Down
78 changes: 56 additions & 22 deletions cmake/AwsSIMD.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,29 @@
include(CheckCCompilerFlag)
include(CheckIncludeFile)

if (MSVC)
set(AWS_AVX2_FLAG "/arch:AVX2")
set(AWS_AVX512_FLAG "/arch:AVX512")
set(AWS_AVX512vL_FLAG "")
set(AWS_PCMUL_FLAG "")
set(AWS_SSE4_2_FLAG "")
else()
set(AWS_AVX2_FLAG "-mavx -mavx2")
set(AWS_AVX512_FLAG "-mavx512f")
set(AWS_AVX512vL_FLAG "mavx512vl")
set(AWS_PCMUL_FLAG "-mvpclmulqdq -mpcmul")
set(AWS_SSE4_2_FLAG "-msse4.2")
endif()

if (USE_CPU_EXTENSIONS)
if (MSVC)
check_c_compiler_flag("/arch:AVX2" HAVE_M_AVX2_FLAG)
if (HAVE_M_AVX2_FLAG)
set(AVX_CFLAGS "/arch:AVX2")
endif()
else()
check_c_compiler_flag(-mavx2 HAVE_M_AVX2_FLAG)
if (HAVE_M_AVX2_FLAG)
set(AVX_CFLAGS "-mavx -mavx2")
endif()
check_c_compiler_flag(${AWS_AVX2_FLAG} HAVE_M_AVX2_FLAG)
if (HAVE_M_AVX2_FLAG)
set(AVX_CFLAGS ${AWS_AVX2_FLAG})
endif()

if (MSVC)
check_c_compiler_flag("/arch:AVX512" HAVE_M_AVX512_FLAG)
if (HAVE_M_AVX512_FLAG)
# docs imply AVX512 brings in AVX2. And it will compile, but it will break at runtime on
# instructions such as _mm256_load_si256(). Leave it on.
set(AVX_CFLAGS "/arch:AVX512 /arch:AVX2")
endif()
else()
check_c_compiler_flag("-mavx512f -mvpclmulqdq" HAVE_M_AVX512_FLAG)
if (HAVE_M_AVX512_FLAG)
set(AVX_CFLAGS "-mavx512f -mvpclmulqdq -mpclmul -mavx -mavx2 -msse4.2")
endif()
check_c_compiler_flag("${AWS_AVX512_FLAG} ${AWS_PCMUL_FLAG}" HAVE_M_AVX512_FLAG)
if (HAVE_M_AVX512_FLAG)
set(AVX_CFLAGS "${AVX_CFLAGS} ${AWS_AVX512_FLAG} ${AWS_PCMUL_FLAG} ${AWS_SSE4_2_FLAG}")
endif()

set(old_flags "${CMAKE_REQUIRED_FLAGS}")
Expand Down Expand Up @@ -83,3 +81,39 @@ function(simd_add_source_avx target)
set_source_files_properties(${file} PROPERTIES COMPILE_FLAGS "${AVX_CFLAGS}")
endforeach()
endfunction(simd_add_source_avx)


function(simd_append_source_avx512 target)
foreach(file ${ARGN})
target_sources(${target} PRIVATE ${file})
set_property(${file} APPEND PROPERTY COMPILE_OPTIONS "${AWS_AVX512_FLAG}")
endforeach()
endfunction(simd_append_source_avx512)

function(simd_append_source_avx2 target)
foreach(file ${ARGN})
target_sources(${target} PRIVATE ${file})
set_property(${file} APPEND PROPERTY COMPILE_OPTIONS "${AWS_AVX2_FLAG}")
endforeach()
endfunction(simd_append_source_avx2)

function(simd_append_source_avx512vl target)
foreach(file ${ARGN})
target_sources(${target} PRIVATE ${file})
set_property(${file} APPEND PROPERTY COMPILE_OPTIONS "${AWS_AVX512vl_FLAG}")
endforeach()
endfunction(simd_append_source_avx512vl)

function(simd_append_source_pcmul target)
foreach(file ${ARGN})
target_sources(${target} PRIVATE ${file})
set_property(${file} APPEND PROPERTY COMPILE_OPTIONS "${AWS_PCMUL_FLAG}")
endforeach()
endfunction(simd_append_source_pcmul)

function(simd_append_source_sse42 target)
foreach(file ${ARGN})
target_sources(${target} PRIVATE ${file})
set_property(${file} APPEND PROPERTY COMPILE_OPTIONS "${AWS_SSE4_2_FLAG}")
endforeach()
endfunction(simd_append_source_sse42)

0 comments on commit 11e0c23

Please sign in to comment.