1*09537850SAkhilesh Sanikop# Copyright 2019 The libgav1 Authors 2*09537850SAkhilesh Sanikop# 3*09537850SAkhilesh Sanikop# Licensed under the Apache License, Version 2.0 (the "License"); 4*09537850SAkhilesh Sanikop# you may not use this file except in compliance with the License. 5*09537850SAkhilesh Sanikop# You may obtain a copy of the License at 6*09537850SAkhilesh Sanikop# 7*09537850SAkhilesh Sanikop# http://www.apache.org/licenses/LICENSE-2.0 8*09537850SAkhilesh Sanikop# 9*09537850SAkhilesh Sanikop# Unless required by applicable law or agreed to in writing, software 10*09537850SAkhilesh Sanikop# distributed under the License is distributed on an "AS IS" BASIS, 11*09537850SAkhilesh Sanikop# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*09537850SAkhilesh Sanikop# See the License for the specific language governing permissions and 13*09537850SAkhilesh Sanikop# limitations under the License. 14*09537850SAkhilesh Sanikop 15*09537850SAkhilesh Sanikopif(LIBGAV1_CMAKE_LIBGAV1_INTRINSICS_CMAKE_) 16*09537850SAkhilesh Sanikop return() 17*09537850SAkhilesh Sanikopendif() # LIBGAV1_CMAKE_LIBGAV1_INTRINSICS_CMAKE_ 18*09537850SAkhilesh Sanikopset(LIBGAV1_CMAKE_LIBGAV1_INTRINSICS_CMAKE_ 1) 19*09537850SAkhilesh Sanikop 20*09537850SAkhilesh Sanikop# Returns the compiler flag for the SIMD intrinsics suffix specified by the 21*09537850SAkhilesh Sanikop# SUFFIX argument via the variable specified by the VARIABLE argument: 22*09537850SAkhilesh Sanikop# libgav1_get_intrinsics_flag_for_suffix(SUFFIX <suffix> VARIABLE <var name>) 23*09537850SAkhilesh Sanikopmacro(libgav1_get_intrinsics_flag_for_suffix) 24*09537850SAkhilesh Sanikop unset(intrinsics_SUFFIX) 25*09537850SAkhilesh Sanikop unset(intrinsics_VARIABLE) 26*09537850SAkhilesh Sanikop unset(optional_args) 27*09537850SAkhilesh Sanikop unset(multi_value_args) 28*09537850SAkhilesh Sanikop set(single_value_args SUFFIX VARIABLE) 29*09537850SAkhilesh Sanikop cmake_parse_arguments(intrinsics "${optional_args}" "${single_value_args}" 30*09537850SAkhilesh Sanikop "${multi_value_args}" ${ARGN}) 31*09537850SAkhilesh Sanikop 32*09537850SAkhilesh Sanikop if(NOT (intrinsics_SUFFIX AND intrinsics_VARIABLE)) 33*09537850SAkhilesh Sanikop message(FATAL_ERROR "libgav1_get_intrinsics_flag_for_suffix: SUFFIX and " 34*09537850SAkhilesh Sanikop "VARIABLE required.") 35*09537850SAkhilesh Sanikop endif() 36*09537850SAkhilesh Sanikop 37*09537850SAkhilesh Sanikop if(intrinsics_SUFFIX MATCHES "neon") 38*09537850SAkhilesh Sanikop if(NOT MSVC) 39*09537850SAkhilesh Sanikop set(${intrinsics_VARIABLE} "${LIBGAV1_NEON_INTRINSICS_FLAG}") 40*09537850SAkhilesh Sanikop endif() 41*09537850SAkhilesh Sanikop elseif(intrinsics_SUFFIX MATCHES "avx2") 42*09537850SAkhilesh Sanikop if(MSVC) 43*09537850SAkhilesh Sanikop set(${intrinsics_VARIABLE} "/arch:AVX2") 44*09537850SAkhilesh Sanikop else() 45*09537850SAkhilesh Sanikop set(${intrinsics_VARIABLE} "-mavx2") 46*09537850SAkhilesh Sanikop endif() 47*09537850SAkhilesh Sanikop elseif(intrinsics_SUFFIX MATCHES "sse4") 48*09537850SAkhilesh Sanikop if(NOT MSVC) 49*09537850SAkhilesh Sanikop set(${intrinsics_VARIABLE} "-msse4.1") 50*09537850SAkhilesh Sanikop endif() 51*09537850SAkhilesh Sanikop else() 52*09537850SAkhilesh Sanikop message(FATAL_ERROR "libgav1_get_intrinsics_flag_for_suffix: Unknown " 53*09537850SAkhilesh Sanikop "instrinics suffix: ${intrinsics_SUFFIX}") 54*09537850SAkhilesh Sanikop endif() 55*09537850SAkhilesh Sanikop 56*09537850SAkhilesh Sanikop if(LIBGAV1_VERBOSE GREATER 1) 57*09537850SAkhilesh Sanikop message("libgav1_get_intrinsics_flag_for_suffix: " 58*09537850SAkhilesh Sanikop "suffix:${intrinsics_SUFFIX} flag:${${intrinsics_VARIABLE}}") 59*09537850SAkhilesh Sanikop endif() 60*09537850SAkhilesh Sanikopendmacro() 61*09537850SAkhilesh Sanikop 62*09537850SAkhilesh Sanikop# Processes source files specified by SOURCES and adds intrinsics flags as 63*09537850SAkhilesh Sanikop# necessary: libgav1_process_intrinsics_sources(SOURCES <sources>) 64*09537850SAkhilesh Sanikop# 65*09537850SAkhilesh Sanikop# Detects requirement for intrinsics flags using source file name suffix. 66*09537850SAkhilesh Sanikop# Currently supports AVX2 and SSE4.1. 67*09537850SAkhilesh Sanikopmacro(libgav1_process_intrinsics_sources) 68*09537850SAkhilesh Sanikop unset(arg_TARGET) 69*09537850SAkhilesh Sanikop unset(arg_SOURCES) 70*09537850SAkhilesh Sanikop unset(optional_args) 71*09537850SAkhilesh Sanikop set(single_value_args TARGET) 72*09537850SAkhilesh Sanikop set(multi_value_args SOURCES) 73*09537850SAkhilesh Sanikop cmake_parse_arguments(arg "${optional_args}" "${single_value_args}" 74*09537850SAkhilesh Sanikop "${multi_value_args}" ${ARGN}) 75*09537850SAkhilesh Sanikop if(NOT (arg_TARGET AND arg_SOURCES)) 76*09537850SAkhilesh Sanikop message(FATAL_ERROR "libgav1_process_intrinsics_sources: TARGET and " 77*09537850SAkhilesh Sanikop "SOURCES required.") 78*09537850SAkhilesh Sanikop endif() 79*09537850SAkhilesh Sanikop 80*09537850SAkhilesh Sanikop if(LIBGAV1_ENABLE_AVX2 AND libgav1_have_avx2) 81*09537850SAkhilesh Sanikop unset(avx2_sources) 82*09537850SAkhilesh Sanikop list(APPEND avx2_sources ${arg_SOURCES}) 83*09537850SAkhilesh Sanikop 84*09537850SAkhilesh Sanikop list(FILTER avx2_sources INCLUDE REGEX 85*09537850SAkhilesh Sanikop "${libgav1_avx2_source_file_suffix}$") 86*09537850SAkhilesh Sanikop 87*09537850SAkhilesh Sanikop if(avx2_sources) 88*09537850SAkhilesh Sanikop unset(avx2_flags) 89*09537850SAkhilesh Sanikop libgav1_get_intrinsics_flag_for_suffix(SUFFIX 90*09537850SAkhilesh Sanikop ${libgav1_avx2_source_file_suffix} 91*09537850SAkhilesh Sanikop VARIABLE avx2_flags) 92*09537850SAkhilesh Sanikop if(avx2_flags) 93*09537850SAkhilesh Sanikop libgav1_set_compiler_flags_for_sources(SOURCES ${avx2_sources} FLAGS 94*09537850SAkhilesh Sanikop ${avx2_flags}) 95*09537850SAkhilesh Sanikop endif() 96*09537850SAkhilesh Sanikop endif() 97*09537850SAkhilesh Sanikop endif() 98*09537850SAkhilesh Sanikop 99*09537850SAkhilesh Sanikop if(LIBGAV1_ENABLE_SSE4_1 AND libgav1_have_sse4) 100*09537850SAkhilesh Sanikop unset(sse4_sources) 101*09537850SAkhilesh Sanikop list(APPEND sse4_sources ${arg_SOURCES}) 102*09537850SAkhilesh Sanikop 103*09537850SAkhilesh Sanikop list(FILTER sse4_sources INCLUDE REGEX 104*09537850SAkhilesh Sanikop "${libgav1_sse4_source_file_suffix}$") 105*09537850SAkhilesh Sanikop 106*09537850SAkhilesh Sanikop if(sse4_sources) 107*09537850SAkhilesh Sanikop unset(sse4_flags) 108*09537850SAkhilesh Sanikop libgav1_get_intrinsics_flag_for_suffix(SUFFIX 109*09537850SAkhilesh Sanikop ${libgav1_sse4_source_file_suffix} 110*09537850SAkhilesh Sanikop VARIABLE sse4_flags) 111*09537850SAkhilesh Sanikop if(sse4_flags) 112*09537850SAkhilesh Sanikop libgav1_set_compiler_flags_for_sources(SOURCES ${sse4_sources} FLAGS 113*09537850SAkhilesh Sanikop ${sse4_flags}) 114*09537850SAkhilesh Sanikop endif() 115*09537850SAkhilesh Sanikop endif() 116*09537850SAkhilesh Sanikop endif() 117*09537850SAkhilesh Sanikop 118*09537850SAkhilesh Sanikop if(LIBGAV1_ENABLE_NEON AND libgav1_have_neon) 119*09537850SAkhilesh Sanikop unset(neon_sources) 120*09537850SAkhilesh Sanikop list(APPEND neon_sources ${arg_SOURCES}) 121*09537850SAkhilesh Sanikop list(FILTER neon_sources INCLUDE REGEX 122*09537850SAkhilesh Sanikop "${libgav1_neon_source_file_suffix}$") 123*09537850SAkhilesh Sanikop 124*09537850SAkhilesh Sanikop if(neon_sources AND LIBGAV1_NEON_INTRINSICS_FLAG) 125*09537850SAkhilesh Sanikop unset(neon_flags) 126*09537850SAkhilesh Sanikop libgav1_get_intrinsics_flag_for_suffix(SUFFIX 127*09537850SAkhilesh Sanikop ${libgav1_neon_source_file_suffix} 128*09537850SAkhilesh Sanikop VARIABLE neon_flags) 129*09537850SAkhilesh Sanikop if(neon_flags) 130*09537850SAkhilesh Sanikop libgav1_set_compiler_flags_for_sources(SOURCES ${neon_sources} FLAGS 131*09537850SAkhilesh Sanikop ${neon_flags}) 132*09537850SAkhilesh Sanikop endif() 133*09537850SAkhilesh Sanikop endif() 134*09537850SAkhilesh Sanikop endif() 135*09537850SAkhilesh Sanikopendmacro() 136