• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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+sve2") # SVE2 is a v9-only feature
23
24  # Check that the compiler flag to enable each flavor is supported by the
25  # compiler. This may not be the case for new architecture features on old
26  # compiler versions.
27  foreach(flavor ${ARM64_FLAVORS})
28    if(ENABLE_${flavor} AND NOT DEFINED AOM_${flavor}_FLAG)
29      set(AOM_${flavor}_FLAG "${AOM_${flavor}_DEFAULT_FLAG}")
30      string(TOLOWER "${flavor}" flavor_lower)
31
32      # Do not use check_c_compiler_flag here since the regex used to match
33      # against stderr does not recognise the "invalid feature modifier" error
34      # produced by certain versions of GCC, leading to the feature being
35      # incorrectly marked as available.
36      set(OLD_CMAKE_REQURED_FLAGS ${CMAKE_REQUIRED_FLAGS})
37      set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${AOM_${flavor}_FLAG}")
38      unset(FLAG_SUPPORTED)
39      aom_check_source_compiles("arm_feature_flag_${flavor_lower}_available"
40                                "static void function(void) {}" FLAG_SUPPORTED)
41      set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQURED_FLAGS})
42
43      if(NOT ${FLAG_SUPPORTED})
44        set(ENABLE_${flavor} 0)
45      endif()
46    endif()
47  endforeach()
48
49  # SVE and SVE2 require that the Neon-SVE bridge header is also available.
50  if(ENABLE_SVE OR ENABLE_SVE2)
51    set(OLD_CMAKE_REQURED_FLAGS ${CMAKE_REQUIRED_FLAGS})
52    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${AOM_SVE_FLAG}")
53    aom_check_source_compiles("arm_neon_sve_bridge_available" "
54#ifndef __ARM_NEON_SVE_BRIDGE
55#error 1
56#endif
57#include <arm_sve.h>
58#include <arm_neon_sve_bridge.h>" HAVE_SVE_HEADERS)
59    set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQURED_FLAGS})
60    if(HAVE_SVE_HEADERS EQUAL 0)
61      set(ENABLE_SVE 0)
62      set(ENABLE_SVE2 0)
63    endif()
64  endif()
65
66  foreach(flavor ${ARM64_FLAVORS})
67    if(ENABLE_${flavor})
68      set(HAVE_${flavor} 1)
69      set(RTCD_HAVE_${flavor} "yes")
70    else()
71      set(HAVE_${flavor} 0)
72      string(TOLOWER ${flavor} flavor)
73      set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-${flavor})
74    endif()
75  endforeach()
76
77elseif("${AOM_TARGET_CPU}" MATCHES "^arm")
78  set(AOM_ARCH_ARM 1)
79  set(RTCD_ARCH_ARM "yes")
80
81  if(ENABLE_NEON)
82    set(HAVE_NEON 1)
83    set(RTCD_HAVE_NEON "yes")
84  else()
85    set(HAVE_NEON 0)
86    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-neon)
87  endif()
88
89elseif("${AOM_TARGET_CPU}" MATCHES "ppc")
90  set(AOM_ARCH_PPC 1)
91  set(RTCD_ARCH_PPC "yes")
92
93  if(ENABLE_VSX)
94    set(HAVE_VSX 1)
95    set(RTCD_HAVE_VSX "yes")
96  else()
97    set(HAVE_VSX 0)
98    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-vsx)
99  endif()
100elseif("${AOM_TARGET_CPU}" MATCHES "^x86")
101  if("${AOM_TARGET_CPU}" STREQUAL "x86")
102    set(AOM_ARCH_X86 1)
103    set(RTCD_ARCH_X86 "yes")
104  elseif("${AOM_TARGET_CPU}" STREQUAL "x86_64")
105    set(AOM_ARCH_X86_64 1)
106    set(RTCD_ARCH_X86_64 "yes")
107  endif()
108
109  set(X86_FLAVORS "MMX;SSE;SSE2;SSE3;SSSE3;SSE4_1;SSE4_2;AVX;AVX2")
110  foreach(flavor ${X86_FLAVORS})
111    if(ENABLE_${flavor} AND NOT disable_remaining_flavors)
112      set(HAVE_${flavor} 1)
113      set(RTCD_HAVE_${flavor} "yes")
114    else()
115      set(disable_remaining_flavors 1)
116      set(HAVE_${flavor} 0)
117      string(TOLOWER ${flavor} flavor)
118      set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-${flavor})
119    endif()
120  endforeach()
121endif()
122