1# 2# Copyright (c) 2017, Alliance for Open Media. All rights reserved. 3# 4# This source code is subject to the terms of the BSD 2 Clause License and the 5# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was 6# not distributed with this source code in the LICENSE file, you can obtain it 7# at www.aomedia.org/license/software. If the Alliance for Open Media Patent 8# License 1.0 was not distributed with this source code in the PATENTS file, you 9# can obtain it at www.aomedia.org/license/patent. 10# 11 12if("${AOM_TARGET_CPU}" STREQUAL "arm64") 13 set(AOM_ARCH_ARM 1) 14 set(AOM_ARCH_AARCH64 1) 15 set(RTCD_ARCH_ARM "yes") 16 17 set(ARM64_FLAVORS "NEON;ARM_CRC32;NEON_DOTPROD;NEON_I8MM;SVE;SVE2") 18 set(AOM_ARM_CRC32_DEFAULT_FLAG "-march=armv8-a+crc") 19 set(AOM_NEON_DOTPROD_DEFAULT_FLAG "-march=armv8.2-a+dotprod") 20 set(AOM_NEON_I8MM_DEFAULT_FLAG "-march=armv8.2-a+dotprod+i8mm") 21 set(AOM_SVE_DEFAULT_FLAG "-march=armv8.2-a+dotprod+i8mm+sve") 22 set(AOM_SVE2_DEFAULT_FLAG "-march=armv9-a+i8mm+sve2") # SVE2 is a v9-only 23 # feature 24 25 # Check that the compiler flag to enable each flavor is supported by the 26 # compiler. This may not be the case for new architecture features on old 27 # compiler versions. 28 foreach(flavor ${ARM64_FLAVORS}) 29 if(ENABLE_${flavor} AND NOT DEFINED AOM_${flavor}_FLAG) 30 set(AOM_${flavor}_FLAG "${AOM_${flavor}_DEFAULT_FLAG}") 31 string(TOLOWER "${flavor}" flavor_lower) 32 33 # Do not use check_c_compiler_flag here since the regex used to match 34 # against stderr does not recognise the "invalid feature modifier" error 35 # produced by certain versions of GCC, leading to the feature being 36 # incorrectly marked as available. 37 set(OLD_CMAKE_REQURED_FLAGS ${CMAKE_REQUIRED_FLAGS}) 38 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${AOM_${flavor}_FLAG}") 39 unset(FLAG_SUPPORTED) 40 aom_check_source_compiles("arm_feature_flag_${flavor_lower}_available" 41 "static void function(void) {}" FLAG_SUPPORTED) 42 set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQURED_FLAGS}) 43 44 if(NOT ${FLAG_SUPPORTED}) 45 set(ENABLE_${flavor} 0) 46 endif() 47 endif() 48 endforeach() 49 50 # SVE and SVE2 require that the Neon-SVE bridge header is also available. 51 if(ENABLE_SVE OR ENABLE_SVE2) 52 set(OLD_CMAKE_REQURED_FLAGS ${CMAKE_REQUIRED_FLAGS}) 53 set(OLD_CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE}) 54 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${AOM_SVE_FLAG}") 55 set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) 56 aom_check_source_compiles("arm_neon_sve_bridge_available" " 57#ifndef __ARM_NEON_SVE_BRIDGE 58#error 1 59#endif 60#include <arm_sve.h> 61#include <arm_neon_sve_bridge.h>" HAVE_SVE_HEADERS) 62 # Check whether the compiler can compile SVE functions that require 63 # backup/restore of SVE registers according to AAPCS. Clang for Windows used 64 # to fail this, see https://github.com/llvm/llvm-project/issues/80009. 65 aom_check_source_compiles("arm_sve_preserve" " 66#include <arm_sve.h> 67void other(void)\; 68svfloat32_t func(svfloat32_t a) { 69 other()\; 70 return a\; 71}" CAN_COMPILE_SVE) 72 set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQURED_FLAGS}) 73 set(CMAKE_TRY_COMPILE_TARGET_TYPE ${OLD_CMAKE_TRY_COMPILE_TARGET_TYPE}) 74 if(HAVE_SVE_HEADERS EQUAL 0 OR CAN_COMPILE_SVE EQUAL 0) 75 set(ENABLE_SVE 0) 76 set(ENABLE_SVE2 0) 77 endif() 78 endif() 79 80 foreach(flavor ${ARM64_FLAVORS}) 81 if(ENABLE_${flavor}) 82 set(HAVE_${flavor} 1) 83 set(RTCD_HAVE_${flavor} "yes") 84 else() 85 set(HAVE_${flavor} 0) 86 string(TOLOWER ${flavor} flavor) 87 set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-${flavor}) 88 endif() 89 endforeach() 90 91elseif("${AOM_TARGET_CPU}" MATCHES "^arm") 92 set(AOM_ARCH_ARM 1) 93 set(RTCD_ARCH_ARM "yes") 94 95 if(ENABLE_NEON) 96 set(HAVE_NEON 1) 97 set(RTCD_HAVE_NEON "yes") 98 else() 99 set(HAVE_NEON 0) 100 set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-neon) 101 endif() 102 103elseif("${AOM_TARGET_CPU}" MATCHES "ppc") 104 set(AOM_ARCH_PPC 1) 105 set(RTCD_ARCH_PPC "yes") 106 107 if(ENABLE_VSX) 108 set(HAVE_VSX 1) 109 set(RTCD_HAVE_VSX "yes") 110 else() 111 set(HAVE_VSX 0) 112 set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-vsx) 113 endif() 114elseif("${AOM_TARGET_CPU}" MATCHES "^x86") 115 if("${AOM_TARGET_CPU}" STREQUAL "x86") 116 set(AOM_ARCH_X86 1) 117 set(RTCD_ARCH_X86 "yes") 118 elseif("${AOM_TARGET_CPU}" STREQUAL "x86_64") 119 set(AOM_ARCH_X86_64 1) 120 set(RTCD_ARCH_X86_64 "yes") 121 endif() 122 123 set(X86_FLAVORS "MMX;SSE;SSE2;SSE3;SSSE3;SSE4_1;SSE4_2;AVX;AVX2") 124 foreach(flavor ${X86_FLAVORS}) 125 if(ENABLE_${flavor} AND NOT disable_remaining_flavors) 126 set(HAVE_${flavor} 1) 127 set(RTCD_HAVE_${flavor} "yes") 128 else() 129 set(disable_remaining_flavors 1) 130 set(HAVE_${flavor} 0) 131 string(TOLOWER ${flavor} flavor) 132 set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-${flavor}) 133 endif() 134 endforeach() 135endif() 136