File: cpu.cmake

package info (click to toggle)
aom 3.13.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 38,340 kB
  • sloc: ansic: 415,031; cpp: 210,937; asm: 9,453; python: 4,479; perl: 2,339; sh: 1,878; pascal: 345; makefile: 57; javascript: 32
file content (142 lines) | stat: -rw-r--r-- 5,153 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#
# Copyright (c) 2017, Alliance for Open Media. All rights reserved.
#
# This source code is subject to the terms of the BSD 2 Clause License and the
# Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License was
# not distributed with this source code in the LICENSE file, you can obtain it
# at www.aomedia.org/license/software. If the Alliance for Open Media Patent
# License 1.0 was not distributed with this source code in the PATENTS file, you
# can obtain it at www.aomedia.org/license/patent.
#

if("${AOM_TARGET_CPU}" STREQUAL "arm64")
  set(AOM_ARCH_ARM 1)
  set(AOM_ARCH_AARCH64 1)

  set(ARM64_FLAVORS "NEON;ARM_CRC32;NEON_DOTPROD;NEON_I8MM;SVE;SVE2")
  set(AOM_ARM_CRC32_DEFAULT_FLAG "-march=armv8-a+crc")
  set(AOM_NEON_DOTPROD_DEFAULT_FLAG "-march=armv8.2-a+dotprod")
  set(AOM_NEON_I8MM_DEFAULT_FLAG "-march=armv8.2-a+dotprod+i8mm")
  set(AOM_SVE_DEFAULT_FLAG "-march=armv8.2-a+dotprod+i8mm+sve")
  set(AOM_SVE2_DEFAULT_FLAG "-march=armv9-a+i8mm+sve2") # SVE2 is a v9-only
                                                        # feature

  # Check that the compiler flag to enable each flavor is supported by the
  # compiler. This may not be the case for new architecture features on old
  # compiler versions.
  foreach(flavor ${ARM64_FLAVORS})
    if(ENABLE_${flavor} AND NOT DEFINED AOM_${flavor}_FLAG)
      set(AOM_${flavor}_FLAG "${AOM_${flavor}_DEFAULT_FLAG}")
      string(TOLOWER "${flavor}" flavor_lower)

      # Do not use check_c_compiler_flag here since the regex used to match
      # against stderr does not recognise the "invalid feature modifier" error
      # produced by certain versions of GCC, leading to the feature being
      # incorrectly marked as available.
      set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
      set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${AOM_${flavor}_FLAG}")
      unset(FLAG_SUPPORTED)
      aom_check_source_compiles("arm_feature_flag_${flavor_lower}_available"
                                "static void function(void) {}" FLAG_SUPPORTED)
      set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})

      if(NOT ${FLAG_SUPPORTED})
        set(ENABLE_${flavor} 0)
      endif()
    endif()
  endforeach()

  # SVE and SVE2 require that the Neon-SVE bridge header is also available.
  if(ENABLE_SVE OR ENABLE_SVE2)
    set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
    set(OLD_CMAKE_TRY_COMPILE_TARGET_TYPE ${CMAKE_TRY_COMPILE_TARGET_TYPE})
    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${AOM_SVE_FLAG}")
    set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
    aom_check_source_compiles("arm_neon_sve_bridge_available" "
#ifndef __ARM_NEON_SVE_BRIDGE
#error 1
#endif
#include <arm_sve.h>
#include <arm_neon_sve_bridge.h>" HAVE_SVE_HEADERS)
    # Check whether the compiler can compile SVE functions that require
    # backup/restore of SVE registers according to AAPCS. Clang for Windows used
    # to fail this, see https://github.com/llvm/llvm-project/issues/80009.
    aom_check_source_compiles("arm_sve_preserve" "
#include <arm_sve.h>
void other(void)\;
svfloat32_t func(svfloat32_t a) {
  other()\;
  return a\;
}" CAN_COMPILE_SVE)
    set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
    set(CMAKE_TRY_COMPILE_TARGET_TYPE ${OLD_CMAKE_TRY_COMPILE_TARGET_TYPE})
    if(HAVE_SVE_HEADERS EQUAL 0 OR CAN_COMPILE_SVE EQUAL 0)
      set(ENABLE_SVE 0)
      set(ENABLE_SVE2 0)
    endif()
  endif()

  foreach(flavor ${ARM64_FLAVORS})
    if(ENABLE_${flavor})
      set(HAVE_${flavor} 1)
    else()
      set(HAVE_${flavor} 0)
      string(TOLOWER ${flavor} flavor)
      set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-${flavor})
    endif()
  endforeach()

elseif("${AOM_TARGET_CPU}" MATCHES "^arm")
  set(AOM_ARCH_ARM 1)

  if(ENABLE_NEON)
    set(HAVE_NEON 1)
  else()
    set(HAVE_NEON 0)
    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-neon)
  endif()

elseif("${AOM_TARGET_CPU}" MATCHES "ppc")
  set(AOM_ARCH_PPC 1)

  if(ENABLE_VSX)
    set(HAVE_VSX 1)
  else()
    set(HAVE_VSX 0)
    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-vsx)
  endif()
elseif("${AOM_TARGET_CPU}" MATCHES "^x86")
  if("${AOM_TARGET_CPU}" STREQUAL "x86")
    set(AOM_ARCH_X86 1)
    # Disable avx512
    set(HAVE_AVX512 0)
    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-avx512)
  elseif("${AOM_TARGET_CPU}" STREQUAL "x86_64")
    set(AOM_ARCH_X86_64 1)
  endif()

  set(X86_FLAVORS "MMX;SSE;SSE2;SSE3;SSSE3;SSE4_1;SSE4_2;AVX;AVX2;AVX512")
  foreach(flavor ${X86_FLAVORS})
    # Special handling of AVX512 on x86-32 above.
    if("${flavor}" STREQUAL "AVX512" AND "${AOM_TARGET_CPU}" STREQUAL "x86")
      continue()
    endif()
    if(ENABLE_${flavor} AND NOT disable_remaining_flavors)
      set(HAVE_${flavor} 1)
    else()
      set(disable_remaining_flavors 1)
      set(HAVE_${flavor} 0)
      string(TOLOWER ${flavor} flavor)
      set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-${flavor})
    endif()
  endforeach()
elseif("${AOM_TARGET_CPU}" MATCHES "riscv")
  set(AOM_ARCH_RISCV64 1)

  if(ENABLE_RVV)
    set(HAVE_RVV 1)
  else()
    set(HAVE_RVV 0)
    set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-rvv)
  endif()
endif()