-
Notifications
You must be signed in to change notification settings - Fork 757
Open
Description
opus/cmake/OpusFunctions.cmake
Lines 44 to 132 in 034c1b6
| function(check_flag NAME FLAG) | |
| include(CheckCCompilerFlag) | |
| check_c_compiler_flag(${FLAG} ${NAME}_SUPPORTED) | |
| endfunction() | |
| include(CheckIncludeFile) | |
| # function to check if compiler supports SSE, SSE2, SSE4.1 and AVX if target | |
| # systems may not have SSE support then use OPUS_MAY_HAVE_SSE option if target | |
| # system is guaranteed to have SSE support then OPUS_PRESUME_SSE can be used to | |
| # skip SSE runtime check | |
| function(opus_detect_sse COMPILER_SUPPORT_SIMD) | |
| message(STATUS "Check SIMD support by compiler") | |
| check_include_file(xmmintrin.h HAVE_XMMINTRIN_H) # SSE1 | |
| if(HAVE_XMMINTRIN_H) | |
| if(MSVC) | |
| # different arch options for 32 and 64 bit target for MSVC | |
| if(CMAKE_SIZEOF_VOID_P EQUAL 4) | |
| check_flag(SSE1 /arch:SSE) | |
| else() | |
| set(SSE1_SUPPORTED | |
| 1 | |
| PARENT_SCOPE) | |
| endif() | |
| else() | |
| check_flag(SSE1 -msse) | |
| endif() | |
| else() | |
| set(SSE1_SUPPORTED | |
| 0 | |
| PARENT_SCOPE) | |
| endif() | |
| check_include_file(emmintrin.h HAVE_EMMINTRIN_H) # SSE2 | |
| if(HAVE_EMMINTRIN_H) | |
| if(MSVC) | |
| if(CMAKE_SIZEOF_VOID_P EQUAL 4) | |
| check_flag(SSE2 /arch:SSE2) | |
| else() | |
| set(SSE2_SUPPORTED | |
| 1 | |
| PARENT_SCOPE) | |
| endif() | |
| else() | |
| check_flag(SSE2 -msse2) | |
| endif() | |
| else() | |
| set(SSE2_SUPPORTED | |
| 0 | |
| PARENT_SCOPE) | |
| endif() | |
| check_include_file(smmintrin.h HAVE_SMMINTRIN_H) # SSE4.1 | |
| if(HAVE_SMMINTRIN_H) | |
| if(MSVC) | |
| if(CMAKE_SIZEOF_VOID_P EQUAL 4) | |
| check_flag(SSE4_1 /arch:SSE2) # SSE2 and above | |
| else() | |
| set(SSE4_1_SUPPORTED | |
| 1 | |
| PARENT_SCOPE) | |
| endif() | |
| else() | |
| check_flag(SSE4_1 -msse4.1) | |
| endif() | |
| else() | |
| set(SSE4_1_SUPPORTED | |
| 0 | |
| PARENT_SCOPE) | |
| endif() | |
| check_include_file(immintrin.h HAVE_IMMINTRIN_H) # AVX | |
| if(HAVE_IMMINTRIN_H) | |
| if(MSVC) | |
| check_flag(AVX /arch:AVX) | |
| else() | |
| check_flag(AVX -mavx) | |
| endif() | |
| else() | |
| set(AVX_SUPPORTED | |
| 0 | |
| PARENT_SCOPE) | |
| endif() | |
| if(SSE1_SUPPORTED OR SSE2_SUPPORTED OR SSE4_1_SUPPORTED OR AVX_SUPPORTED) | |
| set(COMPILER_SUPPORT_SIMD 1 PARENT_SCOPE) | |
| else() | |
| message(STATUS "No SIMD support in compiler") | |
| endif() | |
| endfunction() |
Lines 127 to 206 in b83dd52
| if(OPUS_CPU_X86 OR OPUS_CPU_X64) | |
| set(OPUS_X86_MAY_HAVE_SSE_HELP_STR "does runtime check for SSE1 support.") | |
| cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE | |
| ${OPUS_X86_MAY_HAVE_SSE_HELP_STR} | |
| ON | |
| "SSE1_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| add_feature_info(OPUS_X86_MAY_HAVE_SSE OPUS_X86_MAY_HAVE_SSE ${OPUS_X86_MAY_HAVE_SSE_HELP_STR}) | |
| set(OPUS_X86_MAY_HAVE_SSE2_HELP_STR "does runtime check for SSE2 support.") | |
| cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE2 | |
| ${OPUS_X86_MAY_HAVE_SSE2_HELP_STR} | |
| ON | |
| "SSE2_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| add_feature_info(OPUS_X86_MAY_HAVE_SSE2 OPUS_X86_MAY_HAVE_SSE2 ${OPUS_X86_MAY_HAVE_SSE2_HELP_STR}) | |
| set(OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR "does runtime check for SSE4.1 support.") | |
| cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE4_1 | |
| ${OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR} | |
| ON | |
| "SSE4_1_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| add_feature_info(OPUS_X86_MAY_HAVE_SSE4_1 OPUS_X86_MAY_HAVE_SSE4_1 ${OPUS_X86_MAY_HAVE_SSE4_1_HELP_STR}) | |
| set(OPUS_X86_MAY_HAVE_AVX_HELP_STR "does runtime check for AVX support.") | |
| cmake_dependent_option(OPUS_X86_MAY_HAVE_AVX | |
| ${OPUS_X86_MAY_HAVE_AVX_HELP_STR} | |
| ON | |
| "AVX_SUPPORTED; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| add_feature_info(OPUS_X86_MAY_HAVE_AVX OPUS_X86_MAY_HAVE_AVX ${OPUS_X86_MAY_HAVE_AVX_HELP_STR}) | |
| # PRESUME depends on MAY HAVE, but PRESUME will override runtime detection | |
| set(OPUS_X86_PRESUME_SSE_HELP_STR "assume target CPU has SSE1 support (override runtime check).") | |
| set(OPUS_X86_PRESUME_SSE2_HELP_STR "assume target CPU has SSE2 support (override runtime check).") | |
| if(OPUS_CPU_X64) # Assume x86_64 has up to SSE2 support | |
| cmake_dependent_option(OPUS_X86_PRESUME_SSE | |
| ${OPUS_X86_PRESUME_SSE_HELP_STR} | |
| ON | |
| "OPUS_X86_MAY_HAVE_SSE; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| cmake_dependent_option(OPUS_X86_PRESUME_SSE2 | |
| ${OPUS_X86_PRESUME_SSE2_HELP_STR} | |
| ON | |
| "OPUS_X86_MAY_HAVE_SSE2; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| else() | |
| cmake_dependent_option(OPUS_X86_PRESUME_SSE | |
| ${OPUS_X86_PRESUME_SSE_HELP_STR} | |
| OFF | |
| "OPUS_X86_MAY_HAVE_SSE; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| cmake_dependent_option(OPUS_X86_PRESUME_SSE2 | |
| ${OPUS_X86_PRESUME_SSE2_HELP_STR} | |
| OFF | |
| "OPUS_X86_MAY_HAVE_SSE2; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| endif() | |
| add_feature_info(OPUS_X86_PRESUME_SSE OPUS_X86_PRESUME_SSE ${OPUS_X86_PRESUME_SSE_HELP_STR}) | |
| add_feature_info(OPUS_X86_PRESUME_SSE2 OPUS_X86_PRESUME_SSE2 ${OPUS_X86_PRESUME_SSE2_HELP_STR}) | |
| set(OPUS_X86_PRESUME_SSE4_1_HELP_STR "assume target CPU has SSE4.1 support (override runtime check).") | |
| cmake_dependent_option(OPUS_X86_PRESUME_SSE4_1 | |
| ${OPUS_X86_PRESUME_SSE4_1_HELP_STR} | |
| OFF | |
| "OPUS_X86_MAY_HAVE_SSE4_1; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| add_feature_info(OPUS_X86_PRESUME_SSE4_1 OPUS_X86_PRESUME_SSE4_1 ${OPUS_X86_PRESUME_SSE4_1_HELP_STR}) | |
| set(OPUS_X86_PRESUME_AVX_HELP_STR "assume target CPU has AVX support (override runtime check).") | |
| cmake_dependent_option(OPUS_X86_PRESUME_AVX | |
| ${OPUS_X86_PRESUME_AVX_HELP_STR} | |
| OFF | |
| "OPUS_X86_MAY_HAVE_AVX; NOT OPUS_DISABLE_INTRINSICS" | |
| OFF) | |
| add_feature_info(OPUS_X86_PRESUME_AVX OPUS_X86_PRESUME_AVX ${OPUS_X86_PRESUME_AVX_HELP_STR}) | |
| endif() |
Lines 324 to 450 in b83dd52
| if(NOT OPUS_DISABLE_INTRINSICS) | |
| if((OPUS_X86_MAY_HAVE_SSE AND NOT OPUS_X86_PRESUME_SSE) OR | |
| (OPUS_X86_MAY_HAVE_SSE2 AND NOT OPUS_X86_PRESUME_SSE2) OR | |
| (OPUS_X86_MAY_HAVE_SSE4_1 AND NOT OPUS_X86_PRESUME_SSE4_1) OR | |
| (OPUS_X86_MAY_HAVE_AVX AND NOT OPUS_X86_PRESUME_AVX)) | |
| target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD) | |
| endif() | |
| if(SSE1_SUPPORTED) | |
| if(OPUS_X86_MAY_HAVE_SSE) | |
| add_sources_group(opus celt ${celt_sources_sse}) | |
| target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE) | |
| if(NOT MSVC) | |
| set_source_files_properties(${celt_sources_sse} PROPERTIES COMPILE_FLAGS -msse) | |
| endif() | |
| endif() | |
| if(OPUS_X86_PRESUME_SSE) | |
| target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE) | |
| if(NOT MSVC) | |
| target_compile_options(opus PRIVATE -msse) | |
| endif() | |
| endif() | |
| endif() | |
| if(SSE2_SUPPORTED) | |
| if(OPUS_X86_MAY_HAVE_SSE2) | |
| add_sources_group(opus celt ${celt_sources_sse2}) | |
| target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE2) | |
| if(NOT MSVC) | |
| set_source_files_properties(${celt_sources_sse2} PROPERTIES COMPILE_FLAGS -msse2) | |
| endif() | |
| endif() | |
| if(OPUS_X86_PRESUME_SSE2) | |
| target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE2) | |
| if(NOT MSVC) | |
| target_compile_options(opus PRIVATE -msse2) | |
| endif() | |
| endif() | |
| endif() | |
| if(SSE4_1_SUPPORTED) | |
| if(OPUS_X86_MAY_HAVE_SSE4_1) | |
| add_sources_group(opus celt ${celt_sources_sse4_1}) | |
| add_sources_group(opus silk ${silk_sources_sse4_1}) | |
| target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE4_1) | |
| if(NOT MSVC) | |
| set_source_files_properties(${celt_sources_sse4_1} ${silk_sources_sse4_1} PROPERTIES COMPILE_FLAGS -msse4.1) | |
| endif() | |
| if(OPUS_FIXED_POINT) | |
| add_sources_group(opus silk ${silk_sources_fixed_sse4_1}) | |
| if(NOT MSVC) | |
| set_source_files_properties(${silk_sources_fixed_sse4_1} PROPERTIES COMPILE_FLAGS -msse4.1) | |
| endif() | |
| endif() | |
| endif() | |
| if(OPUS_X86_PRESUME_SSE4_1) | |
| target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE4_1) | |
| if(NOT MSVC) | |
| target_compile_options(opus PRIVATE -msse4.1) | |
| endif() | |
| endif() | |
| endif() | |
| if(AVX_SUPPORTED) | |
| # mostly placeholder in case of avx intrinsics is added | |
| if(OPUS_X86_MAY_HAVE_AVX) | |
| target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_AVX) | |
| endif() | |
| if(OPUS_X86_PRESUME_AVX) | |
| target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_AVX) | |
| if(NOT MSVC) | |
| target_compile_options(opus PRIVATE -mavx) | |
| endif() | |
| endif() | |
| endif() | |
| if(MSVC) | |
| if(AVX_SUPPORTED AND OPUS_X86_PRESUME_AVX) # on 64 bit and 32 bits | |
| add_definitions(/arch:AVX) | |
| elseif(OPUS_CPU_X86) # if AVX not supported then set SSE flag | |
| if((SSE4_1_SUPPORTED AND OPUS_X86_PRESUME_SSE4_1) | |
| OR (SSE2_SUPPORTED AND OPUS_X86_PRESUME_SSE2)) | |
| target_compile_definitions(opus PRIVATE /arch:SSE2) | |
| elseif(SSE1_SUPPORTED AND OPUS_X86_PRESUME_SSE) | |
| target_compile_definitions(opus PRIVATE /arch:SSE) | |
| endif() | |
| endif() | |
| endif() | |
| if(CMAKE_SYSTEM_PROCESSOR MATCHES "(arm|aarch64)") | |
| add_sources_group(opus celt ${celt_sources_arm}) | |
| endif() | |
| if(COMPILER_SUPPORT_NEON) | |
| if(OPUS_MAY_HAVE_NEON) | |
| if(RUNTIME_CPU_CAPABILITY_DETECTION) | |
| message(STATUS "OPUS_MAY_HAVE_NEON enabling runtime detection") | |
| target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD) | |
| else() | |
| message(ERROR "Runtime cpu capability detection needed for MAY_HAVE_NEON") | |
| endif() | |
| # Do runtime check for NEON | |
| target_compile_definitions(opus | |
| PRIVATE | |
| OPUS_ARM_MAY_HAVE_NEON | |
| OPUS_ARM_MAY_HAVE_NEON_INTR) | |
| endif() | |
| add_sources_group(opus celt ${celt_sources_arm_neon_intr}) | |
| add_sources_group(opus silk ${silk_sources_arm_neon_intr}) | |
| # silk arm neon depends on main_Fix.h | |
| target_include_directories(opus PRIVATE silk/fixed) | |
| if(OPUS_FIXED_POINT) | |
| add_sources_group(opus silk ${silk_sources_fixed_arm_neon_intr}) | |
| endif() | |
| if(OPUS_PRESUME_NEON) | |
| target_compile_definitions(opus | |
| PRIVATE | |
| OPUS_ARM_PRESUME_NEON | |
| OPUS_ARM_PRESUME_NEON_INTR) | |
| endif() | |
| endif() | |
| endif() |
I believe that, instead, it should check whether the instruction set is supported by the CPU.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels