diff --git a/CMakeLists.txt b/CMakeLists.txt index 8999f1b925f..b49b2b33e1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,15 @@ elseif(VCLIBS_TARGET_ARCHITECTURE MATCHES "^[aA][rR][mM]64$") add_compile_definitions(_ARM64_ _VCRT_WIN32_WINNT=0x0A00 _STL_WIN32_WINNT=0x0A00 _WIN32_WINNT=0x0A00 NTDDI_VERSION=NTDDI_WIN10) string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " Synchronization.lib") +elseif(VCLIBS_TARGET_ARCHITECTURE MATCHES "^[aA][rR][mM]64[eE][cC]") + set(VCLIBS_TARGET_ARCHITECTURE "arm64EC") + set(VCLIBS_I386_OR_AMD64 "arm64EC") + set(VCLIBS_X86_OR_X64 "arm64") + add_compile_definitions(_ARM64_ _VCRT_WIN32_WINNT=0x0A00 _STL_WIN32_WINNT=0x0A00 + _WIN32_WINNT=0x0A00 NTDDI_VERSION=NTDDI_WIN10) + string(APPEND CMAKE_CXX_STANDARD_LIBRARIES " Synchronization.lib") + add_compile_options(/arm64EC) + add_link_options(/machine:arm64ec) else() message(FATAL_ERROR "Could not determine target architecture: VCLIBS_TARGET_ARCHITECTURE: ${VCLIBS_TARGET_ARCHITECTURE}") endif() diff --git a/azure-devops/cross-build.yml b/azure-devops/cross-build.yml index 0083c39462d..1a7614a68a9 100644 --- a/azure-devops/cross-build.yml +++ b/azure-devops/cross-build.yml @@ -38,7 +38,7 @@ jobs: targetPlatform: ${{ parameters.targetPlatform }} hostArch: ${{ parameters.hostArch }} targetArch: ${{ parameters.vsDevCmdArch }} - cmakeAdditionalFlags: '-DTESTS_BUILD_ONLY=ON' + cmakeAdditionalFlags: '-DTESTS_BUILD_ONLY=ON -DVCLIBS_TARGET_ARCHITECTURE=${{ parameters.targetPlatform }}' - template: run-tests.yml parameters: hostArch: ${{ parameters.hostArch }} diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bc5c06b347e..38ea5a6359e 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -82,7 +82,7 @@ stages: jobs: - template: azure-devops/cross-build.yml parameters: - targetPlatform: arm + targetPlatform: armv7 vsDevCmdArch: arm - stage: Build_ARM64 @@ -93,3 +93,12 @@ stages: parameters: targetPlatform: arm64 vsDevCmdArch: arm64 + + - stage: Build_ARM64EC + dependsOn: Build_And_Test_x64 + displayName: 'Build' + jobs: + - template: azure-devops/cross-build.yml + parameters: + targetPlatform: arm64EC + vsDevCmdArch: arm64 diff --git a/stl/CMakeLists.txt b/stl/CMakeLists.txt index 82d2d1e9707..793925a55e8 100644 --- a/stl/CMakeLists.txt +++ b/stl/CMakeLists.txt @@ -534,7 +534,7 @@ function(add_stl_dlls D_SUFFIX THIS_CONFIG_DEFINITIONS THIS_CONFIG_COMPILE_OPTIO add_library(msvcp${D_SUFFIX}_implib STATIC ${HEADERS}) target_link_libraries(msvcp${D_SUFFIX}_implib msvcp${D_SUFFIX}_implib_objects) add_dependencies(msvcp${D_SUFFIX}_implib msvcp${D_SUFFIX} msvcp_1${D_SUFFIX} msvcp_2${D_SUFFIX} msvcp${D_SUFFIX}_atomic_wait msvcp${D_SUFFIX}_codecvt_ids) - set_target_properties(msvcp${D_SUFFIX}_implib PROPERTIES STATIC_LIBRARY_OPTIONS "/NOLOGO;/NODEFAULTLIB;/IGNORE:4006;$;$;$;$;$") + set_target_properties(msvcp${D_SUFFIX}_implib PROPERTIES STATIC_LIBRARY_OPTIONS "/NOLOGO;/NODEFAULTLIB;/IGNORE:4006;$;$;$;$;$;/machine:${VCLIBS_TARGET_ARCHITECTURE}") set_target_properties(msvcp${D_SUFFIX}_implib PROPERTIES ARCHIVE_OUTPUT_NAME "msvcprt${D_SUFFIX}") endfunction() @@ -545,11 +545,13 @@ function(add_stl_statics FLAVOR_SUFFIX THIS_CONFIG_DEFINITIONS THIS_CONFIG_COMPI add_library(libcpmt${FLAVOR_SUFFIX}_eha OBJECT ${EHA_SOURCES}) target_compile_definitions(libcpmt${FLAVOR_SUFFIX}_eha PRIVATE "${THIS_CONFIG_DEFINITIONS};_ANNOTATE_VECTOR") target_compile_options(libcpmt${FLAVOR_SUFFIX}_eha PRIVATE "${THIS_CONFIG_COMPILE_OPTIONS};/EHa") + set_target_properties(libcpmt${FLAVOR_SUFFIX}_eha PROPERTIES STATIC_LIBRARY_OPTIONS "/machine:${VCLIBS_TARGET_ARCHITECTURE}") add_library(libcpmt${FLAVOR_SUFFIX} STATIC ${HEADERS} ${IMPLIB_SOURCES} ${SOURCES} ${INITIALIZER_SOURCES} ${STATIC_SOURCES}) target_compile_definitions(libcpmt${FLAVOR_SUFFIX} PRIVATE "${THIS_CONFIG_DEFINITIONS};_ANNOTATE_VECTOR") target_compile_options(libcpmt${FLAVOR_SUFFIX} PRIVATE "${THIS_CONFIG_COMPILE_OPTIONS};/EHsc") target_link_libraries(libcpmt${FLAVOR_SUFFIX} PRIVATE Boost::math libcpmt${FLAVOR_SUFFIX}_eha) + set_target_properties(libcpmt${FLAVOR_SUFFIX} PROPERTIES STATIC_LIBRARY_OPTIONS "/machine:${VCLIBS_TARGET_ARCHITECTURE}") endfunction() add_stl_statics("" "_ITERATOR_DEBUG_LEVEL=0" "${VCLIBS_RELEASE_OPTIONS}") @@ -559,3 +561,4 @@ add_stl_statics("d1" "_DEBUG;_ITERATOR_DEBUG_LEVEL=1" "${VCLIBS_DEBUG_OPTIONS}") add_stl_statics("d0" "_DEBUG;_ITERATOR_DEBUG_LEVEL=0" "${VCLIBS_DEBUG_OPTIONS}") add_library(stl_asan STATIC ${ASAN_SOURCES}) +set_target_properties(stl_asan PROPERTIES STATIC_LIBRARY_OPTIONS "/machine:${VCLIBS_TARGET_ARCHITECTURE}") diff --git a/stl/src/vector_algorithms.cpp b/stl/src/vector_algorithms.cpp index bfce5924326..372a4246971 100644 --- a/stl/src/vector_algorithms.cpp +++ b/stl/src/vector_algorithms.cpp @@ -39,6 +39,7 @@ static void _Reverse_copy_tail(_BidIt _First, _BidIt _Last, _OutIt _Dest) noexce } } +#if !defined(_M_ARM64EC) static size_t _Byte_length(const void* _First, const void* _Last) noexcept { return static_cast(_Last) - static_cast(_First); } @@ -50,6 +51,7 @@ static void _Advance_bytes(void*& _Target, ptrdiff_t _Offset) noexcept { static void _Advance_bytes(const void*& _Target, ptrdiff_t _Offset) noexcept { _Target = static_cast(_Target) + _Offset; } +#endif // !defined(_M_ARM64EC) extern "C" { __declspec(noalias) void __cdecl __std_swap_ranges_trivially_swappable_noalias( @@ -68,7 +70,6 @@ __declspec(noalias) void __cdecl __std_swap_ranges_trivially_swappable_noalias( _Advance_bytes(_First2, 32); } while (_First1 != _Stop_at); } -#endif // !defined(_M_ARM64EC) constexpr size_t _Mask_16 = ~((static_cast(1) << 4) - 1); if (_Byte_length(_First1, _Last1) >= 16 @@ -119,6 +120,7 @@ __declspec(noalias) void __cdecl __std_swap_ranges_trivially_swappable_noalias( #else #error Unsupported architecture #endif +#endif // !defined(_M_ARM64EC) auto _First1c = static_cast(_First1); auto _Last1c = static_cast(_Last1); @@ -159,7 +161,6 @@ __declspec(noalias) void __cdecl __std_reverse_trivially_swappable_1(void* _Firs _Advance_bytes(_First, 32); } while (_First != _Stop_at); } -#endif // !defined(_M_ARM64EC) if (_Byte_length(_First, _Last) >= 32 && _bittest(&__isa_enabled, __ISA_AVAILABLE_SSE42)) { const __m128i _Reverse_char_sse = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); @@ -176,6 +177,7 @@ __declspec(noalias) void __cdecl __std_reverse_trivially_swappable_1(void* _Firs _Advance_bytes(_First, 16); } while (_First != _Stop_at); } +#endif // !defined(_M_ARM64EC) _Reverse_tail(static_cast(_First), static_cast(_Last)); } @@ -201,7 +203,6 @@ __declspec(noalias) void __cdecl __std_reverse_trivially_swappable_2(void* _Firs _Advance_bytes(_First, 32); } while (_First != _Stop_at); } -#endif // !defined(_M_ARM64EC) if (_Byte_length(_First, _Last) >= 32 && _bittest(&__isa_enabled, __ISA_AVAILABLE_SSE42)) { const __m128i _Reverse_short_sse = _mm_set_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); @@ -218,6 +219,7 @@ __declspec(noalias) void __cdecl __std_reverse_trivially_swappable_2(void* _Firs _Advance_bytes(_First, 16); } while (_First != _Stop_at); } +#endif // !defined(_M_ARM64EC) _Reverse_tail(static_cast(_First), static_cast(_Last)); } @@ -240,7 +242,6 @@ __declspec(noalias) void __cdecl __std_reverse_trivially_swappable_4(void* _Firs _Advance_bytes(_First, 32); } while (_First != _Stop_at); } -#endif // !defined(_M_ARM64EC) if (_Byte_length(_First, _Last) >= 32 #ifdef _M_IX86 @@ -260,6 +261,7 @@ __declspec(noalias) void __cdecl __std_reverse_trivially_swappable_4(void* _Firs _Advance_bytes(_First, 16); } while (_First != _Stop_at); } +#endif // !defined(_M_ARM64EC) _Reverse_tail(static_cast(_First), static_cast(_Last)); } @@ -280,7 +282,6 @@ __declspec(noalias) void __cdecl __std_reverse_trivially_swappable_8(void* _Firs _Advance_bytes(_First, 32); } while (_First != _Stop_at); } -#endif // !defined(_M_ARM64EC) if (_Byte_length(_First, _Last) >= 32 #ifdef _M_IX86 @@ -301,6 +302,7 @@ __declspec(noalias) void __cdecl __std_reverse_trivially_swappable_8(void* _Firs } while (_First != _Stop_at); } +#endif // !defined(_M_ARM64EC) _Reverse_tail(static_cast(_First), static_cast(_Last)); } @@ -322,7 +324,6 @@ __declspec(noalias) void __cdecl __std_reverse_copy_trivially_copyable_1( _Advance_bytes(_Dest, 32); } while (_Dest != _Stop_at); } -#endif // !defined(_M_ARM64EC) if (_Byte_length(_First, _Last) >= 16 && _bittest(&__isa_enabled, __ISA_AVAILABLE_SSE42)) { const __m128i _Reverse_char_sse = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); @@ -336,6 +337,7 @@ __declspec(noalias) void __cdecl __std_reverse_copy_trivially_copyable_1( _Advance_bytes(_Dest, 16); } while (_Dest != _Stop_at); } +#endif // !defined(_M_ARM64EC) _Reverse_copy_tail(static_cast(_First), static_cast(_Last), static_cast(_Dest)); @@ -359,7 +361,6 @@ __declspec(noalias) void __cdecl __std_reverse_copy_trivially_copyable_2( _Advance_bytes(_Dest, 32); } while (_Dest != _Stop_at); } -#endif // !defined(_M_ARM64EC) if (_Byte_length(_First, _Last) >= 16 && _bittest(&__isa_enabled, __ISA_AVAILABLE_SSE42)) { const __m128i _Reverse_short_sse = _mm_set_epi8(1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14); @@ -373,6 +374,7 @@ __declspec(noalias) void __cdecl __std_reverse_copy_trivially_copyable_2( _Advance_bytes(_Dest, 16); } while (_Dest != _Stop_at); } +#endif // !defined(_M_ARM64EC) _Reverse_copy_tail(static_cast(_First), static_cast(_Last), static_cast(_Dest)); @@ -393,7 +395,6 @@ __declspec(noalias) void __cdecl __std_reverse_copy_trivially_copyable_4( _Advance_bytes(_Dest, 32); } while (_Dest != _Stop_at); } -#endif // !defined(_M_ARM64EC) if (_Byte_length(_First, _Last) >= 16 #ifdef _M_IX86 @@ -410,6 +411,7 @@ __declspec(noalias) void __cdecl __std_reverse_copy_trivially_copyable_4( _Advance_bytes(_Dest, 16); } while (_Dest != _Stop_at); } +#endif // !defined(_M_ARM64EC) _Reverse_copy_tail(static_cast(_First), static_cast(_Last), static_cast(_Dest)); @@ -429,7 +431,6 @@ __declspec(noalias) void __cdecl __std_reverse_copy_trivially_copyable_8( _Advance_bytes(_Dest, 32); } while (_Dest != _Stop_at); } -#endif // !defined(_M_ARM64EC) if (_Byte_length(_First, _Last) >= 16 #ifdef _M_IX86 @@ -446,6 +447,7 @@ __declspec(noalias) void __cdecl __std_reverse_copy_trivially_copyable_8( _Advance_bytes(_Dest, 16); } while (_Dest != _Stop_at); } +#endif // !defined(_M_ARM64EC) _Reverse_copy_tail(static_cast(_First), static_cast(_Last), static_cast(_Dest));