From bcdb3c85c7620722a6a8c9fd9c1efdfe79b677f9 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Wed, 25 Feb 2026 08:40:14 +0200 Subject: [PATCH 1/8] Debug control macro --- stl/inc/xutility | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/stl/inc/xutility b/stl/inc/xutility index 6f91846293f..6cfa3687d92 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -58,9 +58,18 @@ _STL_DISABLE_CLANG_WARNINGS // In the STL's implementation, we inspect the following detection macros, // because various algorithms are vectorized for various architectures. +// _CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC is a marcro to test ARM64EC fallbacks for x64 algorithms + +#if defined(_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC) && !defined(_M_ARM64EC) +#error _CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC should only be defined on _M_ARM64EC +#endif // defined(_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC) && !defined(_M_ARM64EC) + #if !_USE_STD_VECTOR_ALGORITHMS #define _VECTORIZED_FOR_X64_X86 0 #define _VECTORIZED_FOR_X64_X86_ARM64_ARM64EC 0 +#elif defined(_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC) +#define _VECTORIZED_FOR_X64_X86 1 +#define _VECTORIZED_FOR_X64_X86_ARM64_ARM64EC 1 #elif defined(_M_ARM64) || defined(_M_ARM64EC) #define _VECTORIZED_FOR_X64_X86 0 #define _VECTORIZED_FOR_X64_X86_ARM64_ARM64EC 1 From 2075d8e81725aae0f2c4545574970788303076a1 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Wed, 25 Feb 2026 08:40:28 +0200 Subject: [PATCH 2/8] feature control --- tests/utils/stl/test/tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/utils/stl/test/tests.py b/tests/utils/stl/test/tests.py index 44d89d5ed97..f81b795c1d9 100644 --- a/tests/utils/stl/test/tests.py +++ b/tests/utils/stl/test/tests.py @@ -316,6 +316,8 @@ def _parseFlags(self, litConfig): self.requires.append('edg') # available for x64, see features.py elif flag[1:] == 'arch:AVX2': self.requires.append('arch_avx2') # available for x86 and x64, see features.py + elif flag[1:] == 'D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC': + self.requires.append('arm64ec') # available for x86 and x64, see features.py elif flag[1:] == 'MDd': self._addCustomFeature('MDd') self._addCustomFeature('debug_CRT') From 5742a3604328b20b27d9b273eb44c664471dbd7a Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Wed, 25 Feb 2026 08:40:45 +0200 Subject: [PATCH 3/8] matrices --- .../std/tests/VSO_0000000_vector_algorithms/env.lst | 1 + .../VSO_0000000_vector_algorithms_search_n/env.lst | 1 + tests/std/tests/arm64ec_vector_fallbacks_suffix.lst | 13 +++++++++++++ 3 files changed, 15 insertions(+) create mode 100644 tests/std/tests/arm64ec_vector_fallbacks_suffix.lst diff --git a/tests/std/tests/VSO_0000000_vector_algorithms/env.lst b/tests/std/tests/VSO_0000000_vector_algorithms/env.lst index 78fbe6b49a4..f6ea03fd844 100644 --- a/tests/std/tests/VSO_0000000_vector_algorithms/env.lst +++ b/tests/std/tests/VSO_0000000_vector_algorithms/env.lst @@ -2,6 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception RUNALL_INCLUDE ..\usual_matrix.lst +RUNALL_INCLUDE ..\arm64ec_vector_fallbacks_suffix.lst RUNALL_CROSSLIST * PM_CL="" * PM_CL="/D_USE_STD_VECTOR_ALGORITHMS=0" diff --git a/tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst b/tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst index 78fbe6b49a4..f6ea03fd844 100644 --- a/tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst +++ b/tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst @@ -2,6 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception RUNALL_INCLUDE ..\usual_matrix.lst +RUNALL_INCLUDE ..\arm64ec_vector_fallbacks_suffix.lst RUNALL_CROSSLIST * PM_CL="" * PM_CL="/D_USE_STD_VECTOR_ALGORITHMS=0" diff --git a/tests/std/tests/arm64ec_vector_fallbacks_suffix.lst b/tests/std/tests/arm64ec_vector_fallbacks_suffix.lst new file mode 100644 index 00000000000..b003572515f --- /dev/null +++ b/tests/std/tests/arm64ec_vector_fallbacks_suffix.lst @@ -0,0 +1,13 @@ +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MTd /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" +ASAN PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MTd /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC -fsanitize=address /Zi" PM_LINK="/debug" +PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MT /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" +ASAN PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MT /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC -fsanitize=address /Zi" PM_LINK="/debug" +PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MDd /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" +ASAN PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MDd /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC -fsanitize=address /Zi" PM_LINK="/debug" +PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MD /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" +ASAN PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MD /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC -fsanitize=address /Zi" PM_LINK="/debug" +PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /permissive- /EHsc /MD /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC --start-no-unused-arguments" +PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /permissive- /EHsc /MT /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC --start-no-unused-arguments" From fd3b1ff7520fc87cedafb05d2b39724a445d0a85 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Wed, 25 Feb 2026 08:59:37 +0200 Subject: [PATCH 4/8] -stray comment --- tests/utils/stl/test/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/stl/test/tests.py b/tests/utils/stl/test/tests.py index f81b795c1d9..af2e09d0bfa 100644 --- a/tests/utils/stl/test/tests.py +++ b/tests/utils/stl/test/tests.py @@ -317,7 +317,7 @@ def _parseFlags(self, litConfig): elif flag[1:] == 'arch:AVX2': self.requires.append('arch_avx2') # available for x86 and x64, see features.py elif flag[1:] == 'D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC': - self.requires.append('arm64ec') # available for x86 and x64, see features.py + self.requires.append('arm64ec') elif flag[1:] == 'MDd': self._addCustomFeature('MDd') self._addCustomFeature('debug_CRT') From eef5a401092770eebe27cbe1bccf867bcd9ada85 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Wed, 25 Feb 2026 09:05:51 +0200 Subject: [PATCH 5/8] spell --- stl/inc/xutility | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 6cfa3687d92..84cfce27acf 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -58,7 +58,7 @@ _STL_DISABLE_CLANG_WARNINGS // In the STL's implementation, we inspect the following detection macros, // because various algorithms are vectorized for various architectures. -// _CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC is a marcro to test ARM64EC fallbacks for x64 algorithms +// _CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC is a macro to test ARM64EC fallbacks for x64 algorithms #if defined(_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC) && !defined(_M_ARM64EC) #error _CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC should only be defined on _M_ARM64EC From f09b8b9863596405ac4915c590195046b9ede34e Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Wed, 25 Feb 2026 12:47:08 +0200 Subject: [PATCH 6/8] Welcome `search_n`! --- tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst b/tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst index f6ea03fd844..78fbe6b49a4 100644 --- a/tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst +++ b/tests/std/tests/VSO_0000000_vector_algorithms_search_n/env.lst @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception RUNALL_INCLUDE ..\usual_matrix.lst -RUNALL_INCLUDE ..\arm64ec_vector_fallbacks_suffix.lst RUNALL_CROSSLIST * PM_CL="" * PM_CL="/D_USE_STD_VECTOR_ALGORITHMS=0" From 59215d961627f009a70f96e8675868932f3571d9 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 3 Mar 2026 09:55:54 -0800 Subject: [PATCH 7/8] Just crosslist the macro. --- .../std/tests/VSO_0000000_vector_algorithms/env.lst | 2 +- tests/std/tests/arm64ec_vector_fallbacks_suffix.lst | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) delete mode 100644 tests/std/tests/arm64ec_vector_fallbacks_suffix.lst diff --git a/tests/std/tests/VSO_0000000_vector_algorithms/env.lst b/tests/std/tests/VSO_0000000_vector_algorithms/env.lst index f6ea03fd844..7a36bdceb04 100644 --- a/tests/std/tests/VSO_0000000_vector_algorithms/env.lst +++ b/tests/std/tests/VSO_0000000_vector_algorithms/env.lst @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception RUNALL_INCLUDE ..\usual_matrix.lst -RUNALL_INCLUDE ..\arm64ec_vector_fallbacks_suffix.lst RUNALL_CROSSLIST * PM_CL="" * PM_CL="/D_USE_STD_VECTOR_ALGORITHMS=0" +* PM_CL="/D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" diff --git a/tests/std/tests/arm64ec_vector_fallbacks_suffix.lst b/tests/std/tests/arm64ec_vector_fallbacks_suffix.lst deleted file mode 100644 index b003572515f..00000000000 --- a/tests/std/tests/arm64ec_vector_fallbacks_suffix.lst +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) Microsoft Corporation. -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MTd /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" -ASAN PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MTd /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC -fsanitize=address /Zi" PM_LINK="/debug" -PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MT /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" -ASAN PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MT /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC -fsanitize=address /Zi" PM_LINK="/debug" -PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MDd /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" -ASAN PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MDd /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC -fsanitize=address /Zi" PM_LINK="/debug" -PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MD /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC" -ASAN PM_CL="/w14640 /Zc:threadSafeInit- /EHsc /std:c++latest /MD /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC -fsanitize=address /Zi" PM_LINK="/debug" -PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /permissive- /EHsc /MD /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC --start-no-unused-arguments" -PM_COMPILER="clang-cl" PM_CL="-fno-ms-compatibility -fno-delayed-template-parsing -Wno-unqualified-std-cast-call /permissive- /EHsc /MT /D_ITERATOR_DEBUG_LEVEL=0 /D_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC --start-no-unused-arguments" From 0ffd36237cb2ad39e7920625727fe453c9e6d54d Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Tue, 3 Mar 2026 10:03:33 -0800 Subject: [PATCH 8/8] Restrict the effect to ARM64EC, but don't emit an error otherwise. --- stl/inc/xutility | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/stl/inc/xutility b/stl/inc/xutility index 18a85910bbd..49a64d2576c 100644 --- a/stl/inc/xutility +++ b/stl/inc/xutility @@ -58,19 +58,12 @@ _STL_DISABLE_CLANG_WARNINGS // In the STL's implementation, we inspect the following detection macros, // because various algorithms are vectorized for various architectures. -// _CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC is a macro to test ARM64EC fallbacks for x64 algorithms - -#if defined(_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC) && !defined(_M_ARM64EC) -#error _CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC should only be defined on _M_ARM64EC -#endif // defined(_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC) && !defined(_M_ARM64EC) +// _CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC is a macro to test ARM64EC fallbacks for x64 algorithms. #if !_USE_STD_VECTOR_ALGORITHMS #define _VECTORIZED_FOR_X64_X86 0 #define _VECTORIZED_FOR_X64_X86_ARM64_ARM64EC 0 -#elif defined(_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC) -#define _VECTORIZED_FOR_X64_X86 1 -#define _VECTORIZED_FOR_X64_X86_ARM64_ARM64EC 1 -#elif defined(_M_ARM64) || defined(_M_ARM64EC) +#elif defined(_M_ARM64) || (defined(_M_ARM64EC) && !defined(_CALL_ALL_X64_VECTOR_ALGORITHMS_ON_ARM64EC)) #define _VECTORIZED_FOR_X64_X86 0 #define _VECTORIZED_FOR_X64_X86_ARM64_ARM64EC 1 #elif defined(_M_X64) || defined(_M_IX86)