diff --git a/include/mbedtls/build_info.h b/include/mbedtls/build_info.h
index 842f15c58..cb2cda76d 100644
--- a/include/mbedtls/build_info.h
+++ b/include/mbedtls/build_info.h
@@ -74,6 +74,10 @@
 #define MBEDTLS_ARCH_IS_X86
 #endif
 
+#if defined(_M_ARM64) || defined(_M_ARM64EC)
+#define MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64
+#endif
+
 #if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
 #define _CRT_SECURE_NO_DEPRECATE 1
 #endif
diff --git a/library/alignment.h b/library/alignment.h
index ff811e34d..d8c4fb384 100644
--- a/library/alignment.h
+++ b/library/alignment.h
@@ -36,7 +36,7 @@
  */
 #if defined(__ARM_FEATURE_UNALIGNED) \
     || defined(MBEDTLS_ARCH_IS_X86) || defined(MBEDTLS_ARCH_IS_X64) \
-    || defined(_M_ARM64) || defined(_M_ARM64EC)
+    || defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
 /*
  * __ARM_FEATURE_UNALIGNED is defined where appropriate by armcc, gcc 7, clang 9
  * (and later versions) for Arm v7 and later; all x86 platforms should have
diff --git a/library/bignum.c b/library/bignum.c
index 7c265e04d..795952ccd 100644
--- a/library/bignum.c
+++ b/library/bignum.c
@@ -114,7 +114,8 @@ int mbedtls_mpi_lt_mpi_ct(const mbedtls_mpi *X,
  * about whether the assignment was made or not.
  * (Leaking information about the respective sizes of X and Y is ok however.)
  */
-#if defined(_MSC_VER) && defined(_M_ARM64) && (_MSC_FULL_VER < 193131103)
+#if defined(_MSC_VER) && defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64) && \
+    (_MSC_FULL_VER < 193131103)
 /*
  * MSVC miscompiles this function if it's inlined prior to Visual Studio 2022 version 17.1. See:
  * https://developercommunity.visualstudio.com/t/c-compiler-miscompiles-part-of-mbedtls-library-on/1646989
diff --git a/library/common.h b/library/common.h
index 6c65084f4..48fb6d0d7 100644
--- a/library/common.h
+++ b/library/common.h
@@ -34,9 +34,7 @@
 #if defined(__ARM_NEON)
 #include <arm_neon.h>
 #define MBEDTLS_HAVE_NEON_INTRINSICS
-#endif /* __ARM_NEON */
-
-#if defined(_M_ARM64) || defined(_M_ARM64EC)
+#elif defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
 #include <arm64_neon.h>
 #define MBEDTLS_HAVE_NEON_INTRINSICS
 #endif
diff --git a/library/sha256.c b/library/sha256.c
index da6ec180c..ed47c7c51 100644
--- a/library/sha256.c
+++ b/library/sha256.c
@@ -108,7 +108,7 @@
 #      include <signal.h>
 #    endif
 #  endif
-#elif !(defined(_M_ARM64) || defined(_M_ARM64EC))
+#elif !defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
 #  undef MBEDTLS_SHA256_USE_A64_CRYPTO_ONLY
 #  undef MBEDTLS_SHA256_USE_A64_CRYPTO_IF_PRESENT
 #endif
@@ -128,7 +128,7 @@ static int mbedtls_a64_crypto_sha256_determine_support(void)
 {
     return 1;
 }
-#elif defined(_M_ARM64) || defined(_M_ARM64EC)
+#elif defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
 #define WIN32_LEAN_AND_MEAN
 #include <Windows.h>
 #include <processthreadsapi.h>
diff --git a/library/sha512.c b/library/sha512.c
index 0e99914dd..05b89408f 100644
--- a/library/sha512.c
+++ b/library/sha512.c
@@ -119,12 +119,7 @@
 #      include <signal.h>
 #    endif
 #  endif
-#elif defined(_M_ARM64)
-#  if defined(MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT) || \
-    defined(MBEDTLS_SHA512_USE_A64_CRYPTO_ONLY)
-#    include <arm64_neon.h>
-#  endif
-#else
+#elif !defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
 #  undef MBEDTLS_SHA512_USE_A64_CRYPTO_ONLY
 #  undef MBEDTLS_SHA512_USE_A64_CRYPTO_IF_PRESENT
 #endif
@@ -152,7 +147,7 @@ static int mbedtls_a64_crypto_sha512_determine_support(void)
                            NULL, 0);
     return ret == 0 && value != 0;
 }
-#elif defined(_M_ARM64) || defined(_M_ARM64EC)
+#elif defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
 /*
  * As of March 2022, there don't appear to be any PF_ARM_V8_* flags
  * available to pass to IsProcessorFeaturePresent() to check for