From 2dd77050d4c3f7e1bdbe534b6a1957e7a93902f9 Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Fri, 7 Nov 2025 13:58:54 -0500 Subject: [PATCH] [libc] add cpu feature flags for SVE/SVE2/MOPS (#166884) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add in SVE/SVE2/MOPS features for aarch64 cpus. These features may be interesting for future memory/math routines. SVE/SVE2 are now being accepted in more implementations: ``` ❯ echo | clang-21 -dM -E - -march=native | grep -i ARM_FEAT #define __ARM_FEATURE_ATOMICS 1 #define __ARM_FEATURE_BF16 1 #define __ARM_FEATURE_BF16_SCALAR_ARITHMETIC 1 #define __ARM_FEATURE_BF16_VECTOR_ARITHMETIC 1 #define __ARM_FEATURE_BTI 1 #define __ARM_FEATURE_CLZ 1 #define __ARM_FEATURE_COMPLEX 1 #define __ARM_FEATURE_CRC32 1 #define __ARM_FEATURE_DIRECTED_ROUNDING 1 #define __ARM_FEATURE_DIV 1 #define __ARM_FEATURE_DOTPROD 1 #define __ARM_FEATURE_FMA 1 #define __ARM_FEATURE_FP16_SCALAR_ARITHMETIC 1 #define __ARM_FEATURE_FP16_VECTOR_ARITHMETIC 1 #define __ARM_FEATURE_FRINT 1 #define __ARM_FEATURE_IDIV 1 #define __ARM_FEATURE_JCVT 1 #define __ARM_FEATURE_LDREX 0xF #define __ARM_FEATURE_MATMUL_INT8 1 #define __ARM_FEATURE_NUMERIC_MAXMIN 1 #define __ARM_FEATURE_PAUTH 1 #define __ARM_FEATURE_QRDMX 1 #define __ARM_FEATURE_RCPC 1 #define __ARM_FEATURE_SVE 1 #define __ARM_FEATURE_SVE2 1 #define __ARM_FEATURE_SVE_BF16 1 #define __ARM_FEATURE_SVE_MATMUL_INT8 1 #define __ARM_FEATURE_SVE_VECTOR_OPERATORS 2 #define __ARM_FEATURE_UNALIGNED 1 ``` MOPS is another set of extension for string operations, but may not be generally available for now: ``` ❯ echo | clang-21 -dM -E - -march=armv9.2a+mops | grep -i MOPS #define __ARM_FEATURE_MOPS 1 ``` --- libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake | 2 +- libc/cmake/modules/cpu_features/check_MOPS.cpp | 5 +++++ libc/cmake/modules/cpu_features/check_SVE.cpp | 5 +++++ libc/cmake/modules/cpu_features/check_SVE2.cpp | 5 +++++ libc/src/__support/macros/properties/cpu_features.h | 12 ++++++++++++ 5 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 libc/cmake/modules/cpu_features/check_MOPS.cpp create mode 100644 libc/cmake/modules/cpu_features/check_SVE.cpp create mode 100644 libc/cmake/modules/cpu_features/check_SVE2.cpp diff --git a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake index c09d4751d390..d76f3b16b30e 100644 --- a/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake +++ b/libc/cmake/modules/LLVMLibCCheckCpuFeatures.cmake @@ -9,7 +9,7 @@ if(LIBC_TARGET_ARCHITECTURE_IS_X86_64) set(ALL_CPU_FEATURES SSE2 SSE4_2 AVX AVX2 AVX512F AVX512BW FMA) set(LIBC_COMPILE_OPTIONS_NATIVE -march=native) elseif(LIBC_TARGET_ARCHITECTURE_IS_AARCH64) - set(ALL_CPU_FEATURES "FullFP16") + set(ALL_CPU_FEATURES FullFP16 MOPS SVE SVE2) set(LIBC_COMPILE_OPTIONS_NATIVE -mcpu=native) endif() diff --git a/libc/cmake/modules/cpu_features/check_MOPS.cpp b/libc/cmake/modules/cpu_features/check_MOPS.cpp new file mode 100644 index 000000000000..314fe9b38bc8 --- /dev/null +++ b/libc/cmake/modules/cpu_features/check_MOPS.cpp @@ -0,0 +1,5 @@ +#include "src/__support/macros/properties/cpu_features.h" + +#ifndef LIBC_TARGET_CPU_HAS_MOPS +#error unsupported +#endif diff --git a/libc/cmake/modules/cpu_features/check_SVE.cpp b/libc/cmake/modules/cpu_features/check_SVE.cpp new file mode 100644 index 000000000000..725f42f6eb88 --- /dev/null +++ b/libc/cmake/modules/cpu_features/check_SVE.cpp @@ -0,0 +1,5 @@ +#include "src/__support/macros/properties/cpu_features.h" + +#ifndef LIBC_TARGET_CPU_HAS_SVE +#error unsupported +#endif diff --git a/libc/cmake/modules/cpu_features/check_SVE2.cpp b/libc/cmake/modules/cpu_features/check_SVE2.cpp new file mode 100644 index 000000000000..37f4b4fa038b --- /dev/null +++ b/libc/cmake/modules/cpu_features/check_SVE2.cpp @@ -0,0 +1,5 @@ +#include "src/__support/macros/properties/cpu_features.h" + +#ifndef LIBC_TARGET_CPU_HAS_SVE2 +#error unsupported +#endif diff --git a/libc/src/__support/macros/properties/cpu_features.h b/libc/src/__support/macros/properties/cpu_features.h index fc6099ca6ccc..1fe20d9b23a3 100644 --- a/libc/src/__support/macros/properties/cpu_features.h +++ b/libc/src/__support/macros/properties/cpu_features.h @@ -18,6 +18,18 @@ #define LIBC_TARGET_CPU_HAS_FULLFP16 #endif +#if defined(__ARM_FEATURE_SVE) +#define LIBC_TARGET_CPU_HAS_SVE +#endif + +#if defined(__ARM_FEATURE_SVE2) +#define LIBC_TARGET_CPU_HAS_SVE2 +#endif + +#if defined(__ARM_FEATURE_MOPS) +#define LIBC_TARGET_CPU_HAS_MOPS +#endif + #if defined(__SSE2__) #define LIBC_TARGET_CPU_HAS_SSE2 #define LIBC_TARGET_CPU_HAS_FPU_FLOAT