From cb88dfaaeadcd0d84a9d76b7bb2e487dcd5d49bf Mon Sep 17 00:00:00 2001 From: George Steed Date: Wed, 21 Feb 2024 09:46:23 +0000 Subject: [PATCH] Only enable AArch64 extensions if the compiler supports them We already have some logic in the configure.sh file to selectively disable code dependent on particular architecture extensions, however we do not yet have anything to check that the compiler being supplied recognises and can compile code using these extensions. This commit adds compiler "-march=..." flag tests to the existing extension-disable loop so that we now correctly disable extensions that are not supported by the compiler. For AArch64 this loop also needs to move below the existing compiler/OS handling to ensure that prefixes like $CROSS are handled correctly before running compiler tests. NOTE: Fix build error in aarch64. Bug: webm:1841 Change-Id: I936b911c4b0ebf03abc34b7532b2bb4568129f57 (cherry picked from commit fa50b26848ebd89915ec2a5a138a23f1fe69d5eb) --- build/make/configure.sh | 67 ++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/build/make/configure.sh b/build/make/configure.sh index b645a66..f2f84dc 100644 --- a/build/make/configure.sh +++ b/build/make/configure.sh @@ -980,36 +980,18 @@ EOF case ${toolchain} in arm*) soft_enable runtime_cpu_detect - # Arm ISA extensions are treated as supersets. - case ${tgt_isa} in - arm64|armv8) - for ext in ${ARCH_EXT_LIST_AARCH64}; do - # Disable higher order extensions to simplify dependencies. - if [ "$disable_exts" = "yes" ]; then - if ! disabled $ext; then - RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${ext} " - disable_feature $ext - fi - elif disabled $ext; then - disable_exts="yes" - else - soft_enable $ext - fi - done - ;; - armv7|armv7s) - soft_enable neon - # Only enable neon_asm when neon is also enabled. - enabled neon && soft_enable neon_asm - # If someone tries to force it through, die. - if disabled neon && enabled neon_asm; then - die "Disabling neon while keeping neon-asm is not supported" - fi - ;; - esac - asm_conversion_cmd="cat" + if [ ${tgt_isa} = "armv7" ] || [ ${tgt_isa} = "armv7s" ]; then + soft_enable neon + # Only enable neon_asm when neon is also enabled. + enabled neon && soft_enable neon_asm + # If someone tries to force it through, die. + if disabled neon && enabled neon_asm; then + die "Disabling neon while keeping neon-asm is not supported" + fi + fi + asm_conversion_cmd="cat" case ${tgt_cc} in gcc) link_with_cc=gcc @@ -1228,6 +1210,35 @@ EOF fi ;; esac + + # AArch64 ISA extensions are treated as supersets. + if [ ${tgt_isa} = "arm64" ] || [ ${tgt_isa} = "armv8" ]; then + aarch64_arch_flag_neon="arch=armv8-a" + aarch64_arch_flag_neon_dotprod="arch=armv8.2-a+dotprod" + aarch64_arch_flag_neon_i8mm="arch=armv8.2-a+dotprod+i8mm" + aarch64_arch_flag_sve="arch=armv8.2-a+dotprod+i8mm+sve" + for ext in ${ARCH_EXT_LIST_AARCH64}; do + if [ "$disable_exts" = "yes" ]; then + RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${ext} " + soft_disable $ext + else + # Check the compiler supports the -march flag for the extension. + # This needs to happen after toolchain/OS inspection so we handle + # $CROSS etc correctly when checking for flags, else these will + # always fail. + flag="$(eval echo \$"aarch64_arch_flag_${ext}")" + check_gcc_machine_option "${flag}" "${ext}" + if ! enabled $ext; then + # Disable higher order extensions to simplify dependencies. + disable_exts="yes" + RTCD_OPTIONS="${RTCD_OPTIONS}--disable-${ext} " + soft_disable $ext + fi + fi + done + check_neon_sve_bridge_compiles + fi + ;; mips*) link_with_cc=gcc -- 2.7.4