aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/ports/llvm/75711.patch
diff options
context:
space:
mode:
Diffstat (limited to 'vcpkg/ports/llvm/75711.patch')
-rw-r--r--vcpkg/ports/llvm/75711.patch1350
1 files changed, 1350 insertions, 0 deletions
diff --git a/vcpkg/ports/llvm/75711.patch b/vcpkg/ports/llvm/75711.patch
new file mode 100644
index 0000000..15287ef
--- /dev/null
+++ b/vcpkg/ports/llvm/75711.patch
@@ -0,0 +1,1350 @@
+From afec08ef9f1015ea3fe8d67b92acfbb7837c6e9f Mon Sep 17 00:00:00 2001
+From: Max Winkler <max.enrico.winkler@gmail.com>
+Date: Tue, 19 Mar 2024 08:30:54 -0400
+Subject: [PATCH] [clang] Add `intrin0.h` header to mimic `intrin0.h` used by
+ MSVC STL for clang-cl (#75711)
+
+Fixes https://github.com/llvm/llvm-project/issues/53520.
+
+#### Description ####
+
+Provide `intrin0.h` to be the minimal set of intrinsics that the MSVC
+STL requires.
+The `intrin0.h` header matches the latest header provided by MSVC 1939
+which does include some extra intrinsics that the MSVC STL does not use.
+
+Inside `BuiltinHeaders.def` I kept the header description as `intrin.h`.
+If you want me to change those to `intrin0.h` for the moved intrinsics
+let me know.
+
+This should now allow `immintrin.h` to be used with function targets for
+runtime cpu detection of simd instruction sets without worrying about
+the compile-time overhead from MSVC STL including `intrin.h` on clang.
+
+I still need to figure out how to best update MSVC STL to detect for the
+presence of `intrin0.h` from clang and to use this header over
+`intrin.h`.
+
+#### Testing ####
+
+Built clang locally and ran the test suite. I still need to do a pass
+over the existing unit tests for the ms intrinsics to make sure there
+aren't any gaps. Wanted to get this PR up for discussion first.
+
+Modified latest MSVC STL from github to point to `intrin0.h` for clang.
+
+Wrote some test files that included MSVC STL headers that rely on
+intrinsics such as `atomic`, `bit` and `vector`. Built the unit tests
+against x86, arm, aarch64, and x64.
+
+#### Benchmarks ####
+
+The following include times are based on the x64 target with the
+modified headers in this PR.
+These timings were done by using `clang-cl.exe -ftime-trace` and taking
+the wall time for parsing `intrin.h` and `intrin0.h`.
+
+`intrin.h` takes ~897ms to parse.
+`intrin0.h` takes ~1ms to parse.
+
+If there is anything required or a different approach is preferred let
+me know. I would very much like to move this over the finish line so we
+can use function targets with clang-cl.
+---
+ clang/lib/Headers/CMakeLists.txt | 2 +
+ clang/lib/Headers/bmiintrin.h | 6 +-
+ clang/lib/Headers/immintrin.h | 240 ++++++++++-----------------
+ clang/lib/Headers/intrin.h | 217 +-----------------------
+ clang/lib/Headers/intrin0.h | 247 ++++++++++++++++++++++++++++
+ clang/lib/Headers/keylockerintrin.h | 13 +-
+ clang/lib/Headers/x86gprintrin.h | 21 +--
+ clang/lib/Headers/x86intrin.h | 30 ++--
+ clang/lib/Headers/yvals_core.h | 25 +++
+ 10 files changed, 408 insertions(+), 413 deletions(-)
+ create mode 100644 clang/lib/Headers/intrin0.h
+ create mode 100644 clang/lib/Headers/yvals_core.h
+
+diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt
+index 902e33bb95897c..97104ccd8db59c 100644
+--- a/clang/lib/Headers/CMakeLists.txt
++++ b/clang/lib/Headers/CMakeLists.txt
+@@ -254,8 +254,10 @@ set(x86_files
+ )
+
+ set(windows_only_files
++ intrin0.h
+ intrin.h
+ vadefs.h
++ yvals_core.h
+ )
+
+ set(utility_files
+diff --git a/clang/lib/Headers/bmiintrin.h b/clang/lib/Headers/bmiintrin.h
+index d8e57c0cb49404..78bffe68e221a9 100644
+--- a/clang/lib/Headers/bmiintrin.h
++++ b/clang/lib/Headers/bmiintrin.h
+@@ -161,8 +161,7 @@ _mm_tzcnt_64(unsigned long long __X)
+
+ #undef __RELAXED_FN_ATTRS
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__BMI__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__BMI__)
+
+ /* Define the default attributes for the functions in this file. */
+ #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("bmi")))
+@@ -610,7 +609,6 @@ __blsr_u64(unsigned long long __X)
+
+ #undef __DEFAULT_FN_ATTRS
+
+-#endif /* !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) \
+- || defined(__BMI__) */
++#endif /* !defined(__SCE__) || __has_feature(modules) || defined(__BMI__) */
+
+ #endif /* __BMIINTRIN_H */
+diff --git a/clang/lib/Headers/immintrin.h b/clang/lib/Headers/immintrin.h
+index 27800f7a8202c1..508696d3725b9a 100644
+--- a/clang/lib/Headers/immintrin.h
++++ b/clang/lib/Headers/immintrin.h
+@@ -16,281 +16,239 @@
+
+ #include <x86gprintrin.h>
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__MMX__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__MMX__)
+ #include <mmintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SSE__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SSE__)
+ #include <xmmintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SSE2__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SSE2__)
+ #include <emmintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SSE3__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SSE3__)
+ #include <pmmintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SSSE3__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SSSE3__)
+ #include <tmmintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__SSE4_2__) || defined(__SSE4_1__))
+ #include <smmintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AES__) || defined(__PCLMUL__))
+ #include <wmmintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__CLFLUSHOPT__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__CLFLUSHOPT__)
+ #include <clflushoptintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__CLWB__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__CLWB__)
+ #include <clwbintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX__)
+ #include <avxintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX2__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX2__)
+ #include <avx2intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__F16C__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__F16C__)
+ #include <f16cintrin.h>
+ #endif
+
+ /* No feature check desired due to internal checks */
+ #include <bmiintrin.h>
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__BMI2__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__BMI2__)
+ #include <bmi2intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__LZCNT__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__LZCNT__)
+ #include <lzcntintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__POPCNT__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__POPCNT__)
+ #include <popcntintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__FMA__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__FMA__)
+ #include <fmaintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512F__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512F__)
+ #include <avx512fintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512VL__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512VL__)
+ #include <avx512vlintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512BW__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512BW__)
+ #include <avx512bwintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512BITALG__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512BITALG__)
+ #include <avx512bitalgintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512CD__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512CD__)
+ #include <avx512cdintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512VPOPCNTDQ__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512VPOPCNTDQ__)
+ #include <avx512vpopcntdqintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512VPOPCNTDQ__))
+ #include <avx512vpopcntdqvlintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512VNNI__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512VNNI__)
+ #include <avx512vnniintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512VNNI__))
+ #include <avx512vlvnniintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVXVNNI__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVXVNNI__)
+ #include <avxvnniintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512DQ__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512DQ__)
+ #include <avx512dqintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512BITALG__))
+ #include <avx512vlbitalgintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512BW__))
+ #include <avx512vlbwintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512CD__))
+ #include <avx512vlcdintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512DQ__))
+ #include <avx512vldqintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512ER__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512ER__)
+ #include <avx512erintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512IFMA__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512IFMA__)
+ #include <avx512ifmaintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512IFMA__) && defined(__AVX512VL__))
+ #include <avx512ifmavlintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVXIFMA__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVXIFMA__)
+ #include <avxifmaintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512VBMI__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512VBMI__)
+ #include <avx512vbmiintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VBMI__) && defined(__AVX512VL__))
+ #include <avx512vbmivlintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512VBMI2__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512VBMI2__)
+ #include <avx512vbmi2intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VBMI2__) && defined(__AVX512VL__))
+ #include <avx512vlvbmi2intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512PF__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512PF__)
+ #include <avx512pfintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512FP16__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512FP16__)
+ #include <avx512fp16intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512FP16__))
+ #include <avx512vlfp16intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVX512BF16__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVX512BF16__)
+ #include <avx512bf16intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512BF16__))
+ #include <avx512vlbf16intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__PKU__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__PKU__)
+ #include <pkuintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__VPCLMULQDQ__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__VPCLMULQDQ__)
+ #include <vpclmulqdqintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__VAES__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__VAES__)
+ #include <vaesintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__GFNI__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__GFNI__)
+ #include <gfniintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVXVNNIINT8__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVXVNNIINT8__)
+ #include <avxvnniint8intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVXNECONVERT__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVXNECONVERT__)
+ #include <avxneconvertintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SHA512__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SHA512__)
+ #include <sha512intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SM3__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SM3__)
+ #include <sm3intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SM4__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SM4__)
+ #include <sm4intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AVXVNNIINT16__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AVXVNNIINT16__)
+ #include <avxvnniint16intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__RDPID__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__RDPID__)
+ /// Reads the value of the IA32_TSC_AUX MSR (0xc0000103).
+ ///
+ /// \headerfile <immintrin.h>
+@@ -304,8 +262,7 @@ _rdpid_u32(void) {
+ }
+ #endif // __RDPID__
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__RDRND__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__RDRND__)
+ /// Returns a 16-bit hardware-generated random value.
+ ///
+ /// \headerfile <immintrin.h>
+@@ -367,8 +324,7 @@ _rdrand64_step(unsigned long long *__p)
+ }
+ #endif /* __RDRND__ */
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__FSGSBASE__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__FSGSBASE__)
+ #ifdef __x86_64__
+ /// Reads the FS base register.
+ ///
+@@ -481,8 +437,7 @@ _writegsbase_u64(unsigned long long __V)
+ #endif
+ #endif /* __FSGSBASE__ */
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__MOVBE__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__MOVBE__)
+
+ /* The structs used below are to force the load/store to be unaligned. This
+ * is accomplished with the __packed__ attribute. The __may_alias__ prevents
+@@ -598,139 +553,118 @@ _storebe_i64(void * __P, long long __D) {
+ #endif
+ #endif /* __MOVBE */
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__RTM__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__RTM__)
+ #include <rtmintrin.h>
+ #include <xtestintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SHA__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SHA__)
+ #include <shaintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__FXSR__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__FXSR__)
+ #include <fxsrintrin.h>
+ #endif
+
+ /* No feature check desired due to internal MSC_VER checks */
+ #include <xsaveintrin.h>
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__XSAVEOPT__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__XSAVEOPT__)
+ #include <xsaveoptintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__XSAVEC__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__XSAVEC__)
+ #include <xsavecintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__XSAVES__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__XSAVES__)
+ #include <xsavesintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SHSTK__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SHSTK__)
+ #include <cetintrin.h>
+ #endif
+
+ /* Intrinsics inside adcintrin.h are available at all times. */
+ #include <adcintrin.h>
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__ADX__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__ADX__)
+ #include <adxintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__RDSEED__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__RDSEED__)
+ #include <rdseedintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__WBNOINVD__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__WBNOINVD__)
+ #include <wbnoinvdintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__CLDEMOTE__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__CLDEMOTE__)
+ #include <cldemoteintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__WAITPKG__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__WAITPKG__)
+ #include <waitpkgintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__MOVDIRI__) || defined(__MOVDIR64B__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__MOVDIRI__) || \
++ defined(__MOVDIR64B__)
+ #include <movdirintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__PCONFIG__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__PCONFIG__)
+ #include <pconfigintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SGX__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SGX__)
+ #include <sgxintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__PTWRITE__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__PTWRITE__)
+ #include <ptwriteintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__INVPCID__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__INVPCID__)
+ #include <invpcidintrin.h>
+ #endif
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AMX_FP16__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AMX_FP16__)
+ #include <amxfp16intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__KL__) || defined(__WIDEKL__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__KL__) || \
++ defined(__WIDEKL__)
+ #include <keylockerintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AMX_TILE__) || defined(__AMX_INT8__) || defined(__AMX_BF16__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AMX_TILE__) || \
++ defined(__AMX_INT8__) || defined(__AMX_BF16__)
+ #include <amxintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__AMX_COMPLEX__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__AMX_COMPLEX__)
+ #include <amxcomplexintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ defined(__AVX512VP2INTERSECT__)
+ #include <avx512vp2intersectintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
++#if !defined(__SCE__) || __has_feature(modules) || \
+ (defined(__AVX512VL__) && defined(__AVX512VP2INTERSECT__))
+ #include <avx512vlvp2intersectintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__ENQCMD__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__ENQCMD__)
+ #include <enqcmdintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SERIALIZE__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SERIALIZE__)
+ #include <serializeintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__TSXLDTRK__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__TSXLDTRK__)
+ #include <tsxldtrkintrin.h>
+ #endif
+
+diff --git a/clang/lib/Headers/intrin.h b/clang/lib/Headers/intrin.h
+index a6395143db54c2..fd27955fbe002d 100644
+--- a/clang/lib/Headers/intrin.h
++++ b/clang/lib/Headers/intrin.h
+@@ -15,6 +15,8 @@
+ #ifndef __INTRIN_H
+ #define __INTRIN_H
+
++#include <intrin0.h>
++
+ /* First include the standard intrinsics. */
+ #if defined(__i386__) || defined(__x86_64__)
+ #include <x86intrin.h>
+@@ -131,8 +133,6 @@ void __writefsqword(unsigned long, unsigned __int64);
+ void __writefsword(unsigned long, unsigned short);
+ void __writemsr(unsigned long, unsigned __int64);
+ void *_AddressOfReturnAddress(void);
+-unsigned char _BitScanForward(unsigned long *_Index, unsigned long _Mask);
+-unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask);
+ unsigned char _bittest(long const *, long);
+ unsigned char _bittestandcomplement(long *, long);
+ unsigned char _bittestandreset(long *, long);
+@@ -151,7 +151,6 @@ long _InterlockedExchangeAdd_HLERelease(long volatile *, long);
+ __int64 _InterlockedExchangeAdd64_HLEAcquire(__int64 volatile *, __int64);
+ __int64 _InterlockedExchangeAdd64_HLERelease(__int64 volatile *, __int64);
+ void _ReadBarrier(void);
+-void _ReadWriteBarrier(void);
+ unsigned int _rorx_u32(unsigned int, const unsigned int);
+ int _sarx_i32(int, unsigned int);
+ #if __STDC_HOSTED__
+@@ -182,12 +181,6 @@ unsigned char __readgsbyte(unsigned long);
+ unsigned long __readgsdword(unsigned long);
+ unsigned __int64 __readgsqword(unsigned long);
+ unsigned short __readgsword(unsigned long);
+-unsigned __int64 __shiftleft128(unsigned __int64 _LowPart,
+- unsigned __int64 _HighPart,
+- unsigned char _Shift);
+-unsigned __int64 __shiftright128(unsigned __int64 _LowPart,
+- unsigned __int64 _HighPart,
+- unsigned char _Shift);
+ void __stosq(unsigned __int64 *, unsigned __int64, size_t);
+ unsigned char __vmx_on(unsigned __int64 *);
+ unsigned char __vmx_vmclear(unsigned __int64 *);
+@@ -236,212 +229,10 @@ unsigned __int64 _shlx_u64(unsigned __int64, unsigned int);
+ unsigned __int64 _shrx_u64(unsigned __int64, unsigned int);
+ __int64 __mulh(__int64, __int64);
+ unsigned __int64 __umulh(unsigned __int64, unsigned __int64);
+-__int64 _mul128(__int64, __int64, __int64*);
+-unsigned __int64 _umul128(unsigned __int64,
+- unsigned __int64,
+- unsigned __int64*);
++__int64 _mul128(__int64, __int64, __int64 *);
+
+ #endif /* __x86_64__ */
+
+-#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
+-
+-unsigned char _BitScanForward64(unsigned long *_Index, unsigned __int64 _Mask);
+-unsigned char _BitScanReverse64(unsigned long *_Index, unsigned __int64 _Mask);
+-
+-#endif
+-
+-#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
+-__int64 _InterlockedDecrement64(__int64 volatile *_Addend);
+-__int64 _InterlockedExchange64(__int64 volatile *_Target, __int64 _Value);
+-__int64 _InterlockedExchangeAdd64(__int64 volatile *_Addend, __int64 _Value);
+-__int64 _InterlockedExchangeSub64(__int64 volatile *_Subend, __int64 _Value);
+-__int64 _InterlockedIncrement64(__int64 volatile *_Addend);
+-__int64 _InterlockedOr64(__int64 volatile *_Value, __int64 _Mask);
+-__int64 _InterlockedXor64(__int64 volatile *_Value, __int64 _Mask);
+-__int64 _InterlockedAnd64(__int64 volatile *_Value, __int64 _Mask);
+-
+-#endif
+-
+-/*----------------------------------------------------------------------------*\
+-|* Interlocked Exchange Add
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-char _InterlockedExchangeAdd8_acq(char volatile *_Addend, char _Value);
+-char _InterlockedExchangeAdd8_nf(char volatile *_Addend, char _Value);
+-char _InterlockedExchangeAdd8_rel(char volatile *_Addend, char _Value);
+-short _InterlockedExchangeAdd16_acq(short volatile *_Addend, short _Value);
+-short _InterlockedExchangeAdd16_nf(short volatile *_Addend, short _Value);
+-short _InterlockedExchangeAdd16_rel(short volatile *_Addend, short _Value);
+-long _InterlockedExchangeAdd_acq(long volatile *_Addend, long _Value);
+-long _InterlockedExchangeAdd_nf(long volatile *_Addend, long _Value);
+-long _InterlockedExchangeAdd_rel(long volatile *_Addend, long _Value);
+-__int64 _InterlockedExchangeAdd64_acq(__int64 volatile *_Addend, __int64 _Value);
+-__int64 _InterlockedExchangeAdd64_nf(__int64 volatile *_Addend, __int64 _Value);
+-__int64 _InterlockedExchangeAdd64_rel(__int64 volatile *_Addend, __int64 _Value);
+-#endif
+-/*----------------------------------------------------------------------------*\
+-|* Interlocked Increment
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-short _InterlockedIncrement16_acq(short volatile *_Value);
+-short _InterlockedIncrement16_nf(short volatile *_Value);
+-short _InterlockedIncrement16_rel(short volatile *_Value);
+-long _InterlockedIncrement_acq(long volatile *_Value);
+-long _InterlockedIncrement_nf(long volatile *_Value);
+-long _InterlockedIncrement_rel(long volatile *_Value);
+-__int64 _InterlockedIncrement64_acq(__int64 volatile *_Value);
+-__int64 _InterlockedIncrement64_nf(__int64 volatile *_Value);
+-__int64 _InterlockedIncrement64_rel(__int64 volatile *_Value);
+-#endif
+-/*----------------------------------------------------------------------------*\
+-|* Interlocked Decrement
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-short _InterlockedDecrement16_acq(short volatile *_Value);
+-short _InterlockedDecrement16_nf(short volatile *_Value);
+-short _InterlockedDecrement16_rel(short volatile *_Value);
+-long _InterlockedDecrement_acq(long volatile *_Value);
+-long _InterlockedDecrement_nf(long volatile *_Value);
+-long _InterlockedDecrement_rel(long volatile *_Value);
+-__int64 _InterlockedDecrement64_acq(__int64 volatile *_Value);
+-__int64 _InterlockedDecrement64_nf(__int64 volatile *_Value);
+-__int64 _InterlockedDecrement64_rel(__int64 volatile *_Value);
+-#endif
+-/*----------------------------------------------------------------------------*\
+-|* Interlocked And
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-char _InterlockedAnd8_acq(char volatile *_Value, char _Mask);
+-char _InterlockedAnd8_nf(char volatile *_Value, char _Mask);
+-char _InterlockedAnd8_rel(char volatile *_Value, char _Mask);
+-short _InterlockedAnd16_acq(short volatile *_Value, short _Mask);
+-short _InterlockedAnd16_nf(short volatile *_Value, short _Mask);
+-short _InterlockedAnd16_rel(short volatile *_Value, short _Mask);
+-long _InterlockedAnd_acq(long volatile *_Value, long _Mask);
+-long _InterlockedAnd_nf(long volatile *_Value, long _Mask);
+-long _InterlockedAnd_rel(long volatile *_Value, long _Mask);
+-__int64 _InterlockedAnd64_acq(__int64 volatile *_Value, __int64 _Mask);
+-__int64 _InterlockedAnd64_nf(__int64 volatile *_Value, __int64 _Mask);
+-__int64 _InterlockedAnd64_rel(__int64 volatile *_Value, __int64 _Mask);
+-#endif
+-/*----------------------------------------------------------------------------*\
+-|* Bit Counting and Testing
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-unsigned char _interlockedbittestandset_acq(long volatile *_BitBase,
+- long _BitPos);
+-unsigned char _interlockedbittestandset_nf(long volatile *_BitBase,
+- long _BitPos);
+-unsigned char _interlockedbittestandset_rel(long volatile *_BitBase,
+- long _BitPos);
+-unsigned char _interlockedbittestandreset_acq(long volatile *_BitBase,
+- long _BitPos);
+-unsigned char _interlockedbittestandreset_nf(long volatile *_BitBase,
+- long _BitPos);
+-unsigned char _interlockedbittestandreset_rel(long volatile *_BitBase,
+- long _BitPos);
+-#endif
+-/*----------------------------------------------------------------------------*\
+-|* Interlocked Or
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-char _InterlockedOr8_acq(char volatile *_Value, char _Mask);
+-char _InterlockedOr8_nf(char volatile *_Value, char _Mask);
+-char _InterlockedOr8_rel(char volatile *_Value, char _Mask);
+-short _InterlockedOr16_acq(short volatile *_Value, short _Mask);
+-short _InterlockedOr16_nf(short volatile *_Value, short _Mask);
+-short _InterlockedOr16_rel(short volatile *_Value, short _Mask);
+-long _InterlockedOr_acq(long volatile *_Value, long _Mask);
+-long _InterlockedOr_nf(long volatile *_Value, long _Mask);
+-long _InterlockedOr_rel(long volatile *_Value, long _Mask);
+-__int64 _InterlockedOr64_acq(__int64 volatile *_Value, __int64 _Mask);
+-__int64 _InterlockedOr64_nf(__int64 volatile *_Value, __int64 _Mask);
+-__int64 _InterlockedOr64_rel(__int64 volatile *_Value, __int64 _Mask);
+-#endif
+-/*----------------------------------------------------------------------------*\
+-|* Interlocked Xor
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-char _InterlockedXor8_acq(char volatile *_Value, char _Mask);
+-char _InterlockedXor8_nf(char volatile *_Value, char _Mask);
+-char _InterlockedXor8_rel(char volatile *_Value, char _Mask);
+-short _InterlockedXor16_acq(short volatile *_Value, short _Mask);
+-short _InterlockedXor16_nf(short volatile *_Value, short _Mask);
+-short _InterlockedXor16_rel(short volatile *_Value, short _Mask);
+-long _InterlockedXor_acq(long volatile *_Value, long _Mask);
+-long _InterlockedXor_nf(long volatile *_Value, long _Mask);
+-long _InterlockedXor_rel(long volatile *_Value, long _Mask);
+-__int64 _InterlockedXor64_acq(__int64 volatile *_Value, __int64 _Mask);
+-__int64 _InterlockedXor64_nf(__int64 volatile *_Value, __int64 _Mask);
+-__int64 _InterlockedXor64_rel(__int64 volatile *_Value, __int64 _Mask);
+-#endif
+-/*----------------------------------------------------------------------------*\
+-|* Interlocked Exchange
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-char _InterlockedExchange8_acq(char volatile *_Target, char _Value);
+-char _InterlockedExchange8_nf(char volatile *_Target, char _Value);
+-char _InterlockedExchange8_rel(char volatile *_Target, char _Value);
+-short _InterlockedExchange16_acq(short volatile *_Target, short _Value);
+-short _InterlockedExchange16_nf(short volatile *_Target, short _Value);
+-short _InterlockedExchange16_rel(short volatile *_Target, short _Value);
+-long _InterlockedExchange_acq(long volatile *_Target, long _Value);
+-long _InterlockedExchange_nf(long volatile *_Target, long _Value);
+-long _InterlockedExchange_rel(long volatile *_Target, long _Value);
+-__int64 _InterlockedExchange64_acq(__int64 volatile *_Target, __int64 _Value);
+-__int64 _InterlockedExchange64_nf(__int64 volatile *_Target, __int64 _Value);
+-__int64 _InterlockedExchange64_rel(__int64 volatile *_Target, __int64 _Value);
+-#endif
+-/*----------------------------------------------------------------------------*\
+-|* Interlocked Compare Exchange
+-\*----------------------------------------------------------------------------*/
+-#if defined(__arm__) || defined(__aarch64__)
+-char _InterlockedCompareExchange8_acq(char volatile *_Destination,
+- char _Exchange, char _Comparand);
+-char _InterlockedCompareExchange8_nf(char volatile *_Destination,
+- char _Exchange, char _Comparand);
+-char _InterlockedCompareExchange8_rel(char volatile *_Destination,
+- char _Exchange, char _Comparand);
+-short _InterlockedCompareExchange16_acq(short volatile *_Destination,
+- short _Exchange, short _Comparand);
+-short _InterlockedCompareExchange16_nf(short volatile *_Destination,
+- short _Exchange, short _Comparand);
+-short _InterlockedCompareExchange16_rel(short volatile *_Destination,
+- short _Exchange, short _Comparand);
+-long _InterlockedCompareExchange_acq(long volatile *_Destination,
+- long _Exchange, long _Comparand);
+-long _InterlockedCompareExchange_nf(long volatile *_Destination,
+- long _Exchange, long _Comparand);
+-long _InterlockedCompareExchange_rel(long volatile *_Destination,
+- long _Exchange, long _Comparand);
+-__int64 _InterlockedCompareExchange64_acq(__int64 volatile *_Destination,
+- __int64 _Exchange, __int64 _Comparand);
+-__int64 _InterlockedCompareExchange64_nf(__int64 volatile *_Destination,
+- __int64 _Exchange, __int64 _Comparand);
+-__int64 _InterlockedCompareExchange64_rel(__int64 volatile *_Destination,
+- __int64 _Exchange, __int64 _Comparand);
+-#endif
+-#if defined(__x86_64__) || defined(__aarch64__)
+-unsigned char _InterlockedCompareExchange128(__int64 volatile *_Destination,
+- __int64 _ExchangeHigh,
+- __int64 _ExchangeLow,
+- __int64 *_ComparandResult);
+-#endif
+-#if defined(__aarch64__)
+-unsigned char _InterlockedCompareExchange128_acq(__int64 volatile *_Destination,
+- __int64 _ExchangeHigh,
+- __int64 _ExchangeLow,
+- __int64 *_ComparandResult);
+-unsigned char _InterlockedCompareExchange128_nf(__int64 volatile *_Destination,
+- __int64 _ExchangeHigh,
+- __int64 _ExchangeLow,
+- __int64 *_ComparandResult);
+-unsigned char _InterlockedCompareExchange128_rel(__int64 volatile *_Destination,
+- __int64 _ExchangeHigh,
+- __int64 _ExchangeLow,
+- __int64 *_ComparandResult);
+-#endif
+-
+ /*----------------------------------------------------------------------------*\
+ |* movs, stos
+ \*----------------------------------------------------------------------------*/
+@@ -583,8 +374,6 @@ unsigned int _CountLeadingOnes(unsigned long);
+ unsigned int _CountLeadingOnes64(unsigned __int64);
+ unsigned int _CountLeadingSigns(long);
+ unsigned int _CountLeadingSigns64(__int64);
+-unsigned int _CountLeadingZeros(unsigned long);
+-unsigned int _CountLeadingZeros64(unsigned _int64);
+ unsigned int _CountOneBits(unsigned long);
+ unsigned int _CountOneBits64(unsigned __int64);
+
+diff --git a/clang/lib/Headers/intrin0.h b/clang/lib/Headers/intrin0.h
+new file mode 100644
+index 00000000000000..31f362ec84d5c5
+--- /dev/null
++++ b/clang/lib/Headers/intrin0.h
+@@ -0,0 +1,247 @@
++/* ===-------- intrin.h ---------------------------------------------------===
++ *
++ * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
++ * See https://llvm.org/LICENSE.txt for license information.
++ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
++ *
++ *===-----------------------------------------------------------------------===
++ */
++
++/* Only include this if we're compiling for the windows platform. */
++#ifndef _MSC_VER
++#include_next <intrin0.h>
++#else
++
++#ifndef __INTRIN0_H
++#define __INTRIN0_H
++
++#ifdef __x86_64__
++#include <adcintrin.h>
++#endif
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++unsigned char _BitScanForward(unsigned long *_Index, unsigned long _Mask);
++unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask);
++void _ReadWriteBarrier(void);
++
++#if defined(__aarch64__)
++unsigned int _CountLeadingZeros(unsigned long);
++unsigned int _CountLeadingZeros64(unsigned _int64);
++unsigned char _InterlockedCompareExchange128_acq(__int64 volatile *_Destination,
++ __int64 _ExchangeHigh,
++ __int64 _ExchangeLow,
++ __int64 *_ComparandResult);
++unsigned char _InterlockedCompareExchange128_nf(__int64 volatile *_Destination,
++ __int64 _ExchangeHigh,
++ __int64 _ExchangeLow,
++ __int64 *_ComparandResult);
++unsigned char _InterlockedCompareExchange128_rel(__int64 volatile *_Destination,
++ __int64 _ExchangeHigh,
++ __int64 _ExchangeLow,
++ __int64 *_ComparandResult);
++#endif
++
++#ifdef __x86_64__
++unsigned __int64 _umul128(unsigned __int64, unsigned __int64,
++ unsigned __int64 *);
++unsigned __int64 __shiftleft128(unsigned __int64 _LowPart,
++ unsigned __int64 _HighPart,
++ unsigned char _Shift);
++unsigned __int64 __shiftright128(unsigned __int64 _LowPart,
++ unsigned __int64 _HighPart,
++ unsigned char _Shift);
++#endif
++
++#if defined(__x86_64__) || defined(__i386__)
++void _mm_pause(void);
++#endif
++
++#if defined(__x86_64__) || defined(__aarch64__)
++unsigned char _InterlockedCompareExchange128(__int64 volatile *_Destination,
++ __int64 _ExchangeHigh,
++ __int64 _ExchangeLow,
++ __int64 *_ComparandResult);
++#endif
++
++#if defined(__x86_64__) || defined(__arm__) || defined(__aarch64__)
++unsigned char _BitScanForward64(unsigned long *_Index, unsigned __int64 _Mask);
++unsigned char _BitScanReverse64(unsigned long *_Index, unsigned __int64 _Mask);
++#endif
++
++#if defined(__i386__) || defined(__x86_64__) || defined(__arm__) || \
++ defined(__aarch64__)
++__int64 _InterlockedDecrement64(__int64 volatile *_Addend);
++__int64 _InterlockedExchange64(__int64 volatile *_Target, __int64 _Value);
++__int64 _InterlockedExchangeAdd64(__int64 volatile *_Addend, __int64 _Value);
++__int64 _InterlockedExchangeSub64(__int64 volatile *_Subend, __int64 _Value);
++__int64 _InterlockedIncrement64(__int64 volatile *_Addend);
++__int64 _InterlockedOr64(__int64 volatile *_Value, __int64 _Mask);
++__int64 _InterlockedXor64(__int64 volatile *_Value, __int64 _Mask);
++__int64 _InterlockedAnd64(__int64 volatile *_Value, __int64 _Mask);
++#endif
++
++#if defined(__arm__) || defined(__aarch64__)
++/*----------------------------------------------------------------------------*\
++|* Interlocked Exchange Add
++\*----------------------------------------------------------------------------*/
++char _InterlockedExchangeAdd8_acq(char volatile *_Addend, char _Value);
++char _InterlockedExchangeAdd8_nf(char volatile *_Addend, char _Value);
++char _InterlockedExchangeAdd8_rel(char volatile *_Addend, char _Value);
++short _InterlockedExchangeAdd16_acq(short volatile *_Addend, short _Value);
++short _InterlockedExchangeAdd16_nf(short volatile *_Addend, short _Value);
++short _InterlockedExchangeAdd16_rel(short volatile *_Addend, short _Value);
++long _InterlockedExchangeAdd_acq(long volatile *_Addend, long _Value);
++long _InterlockedExchangeAdd_nf(long volatile *_Addend, long _Value);
++long _InterlockedExchangeAdd_rel(long volatile *_Addend, long _Value);
++__int64 _InterlockedExchangeAdd64_acq(__int64 volatile *_Addend,
++ __int64 _Value);
++__int64 _InterlockedExchangeAdd64_nf(__int64 volatile *_Addend, __int64 _Value);
++__int64 _InterlockedExchangeAdd64_rel(__int64 volatile *_Addend,
++ __int64 _Value);
++
++/*----------------------------------------------------------------------------*\
++|* Interlocked Increment
++\*----------------------------------------------------------------------------*/
++short _InterlockedIncrement16_acq(short volatile *_Value);
++short _InterlockedIncrement16_nf(short volatile *_Value);
++short _InterlockedIncrement16_rel(short volatile *_Value);
++long _InterlockedIncrement_acq(long volatile *_Value);
++long _InterlockedIncrement_nf(long volatile *_Value);
++long _InterlockedIncrement_rel(long volatile *_Value);
++__int64 _InterlockedIncrement64_acq(__int64 volatile *_Value);
++__int64 _InterlockedIncrement64_nf(__int64 volatile *_Value);
++__int64 _InterlockedIncrement64_rel(__int64 volatile *_Value);
++
++/*----------------------------------------------------------------------------*\
++|* Interlocked Decrement
++\*----------------------------------------------------------------------------*/
++short _InterlockedDecrement16_acq(short volatile *_Value);
++short _InterlockedDecrement16_nf(short volatile *_Value);
++short _InterlockedDecrement16_rel(short volatile *_Value);
++long _InterlockedDecrement_acq(long volatile *_Value);
++long _InterlockedDecrement_nf(long volatile *_Value);
++long _InterlockedDecrement_rel(long volatile *_Value);
++__int64 _InterlockedDecrement64_acq(__int64 volatile *_Value);
++__int64 _InterlockedDecrement64_nf(__int64 volatile *_Value);
++__int64 _InterlockedDecrement64_rel(__int64 volatile *_Value);
++
++/*----------------------------------------------------------------------------*\
++|* Interlocked And
++\*----------------------------------------------------------------------------*/
++char _InterlockedAnd8_acq(char volatile *_Value, char _Mask);
++char _InterlockedAnd8_nf(char volatile *_Value, char _Mask);
++char _InterlockedAnd8_rel(char volatile *_Value, char _Mask);
++short _InterlockedAnd16_acq(short volatile *_Value, short _Mask);
++short _InterlockedAnd16_nf(short volatile *_Value, short _Mask);
++short _InterlockedAnd16_rel(short volatile *_Value, short _Mask);
++long _InterlockedAnd_acq(long volatile *_Value, long _Mask);
++long _InterlockedAnd_nf(long volatile *_Value, long _Mask);
++long _InterlockedAnd_rel(long volatile *_Value, long _Mask);
++__int64 _InterlockedAnd64_acq(__int64 volatile *_Value, __int64 _Mask);
++__int64 _InterlockedAnd64_nf(__int64 volatile *_Value, __int64 _Mask);
++__int64 _InterlockedAnd64_rel(__int64 volatile *_Value, __int64 _Mask);
++
++/*----------------------------------------------------------------------------*\
++|* Bit Counting and Testing
++\*----------------------------------------------------------------------------*/
++unsigned char _interlockedbittestandset_acq(long volatile *_BitBase,
++ long _BitPos);
++unsigned char _interlockedbittestandset_nf(long volatile *_BitBase,
++ long _BitPos);
++unsigned char _interlockedbittestandset_rel(long volatile *_BitBase,
++ long _BitPos);
++unsigned char _interlockedbittestandreset_acq(long volatile *_BitBase,
++ long _BitPos);
++unsigned char _interlockedbittestandreset_nf(long volatile *_BitBase,
++ long _BitPos);
++unsigned char _interlockedbittestandreset_rel(long volatile *_BitBase,
++ long _BitPos);
++
++/*----------------------------------------------------------------------------*\
++|* Interlocked Or
++\*----------------------------------------------------------------------------*/
++char _InterlockedOr8_acq(char volatile *_Value, char _Mask);
++char _InterlockedOr8_nf(char volatile *_Value, char _Mask);
++char _InterlockedOr8_rel(char volatile *_Value, char _Mask);
++short _InterlockedOr16_acq(short volatile *_Value, short _Mask);
++short _InterlockedOr16_nf(short volatile *_Value, short _Mask);
++short _InterlockedOr16_rel(short volatile *_Value, short _Mask);
++long _InterlockedOr_acq(long volatile *_Value, long _Mask);
++long _InterlockedOr_nf(long volatile *_Value, long _Mask);
++long _InterlockedOr_rel(long volatile *_Value, long _Mask);
++__int64 _InterlockedOr64_acq(__int64 volatile *_Value, __int64 _Mask);
++__int64 _InterlockedOr64_nf(__int64 volatile *_Value, __int64 _Mask);
++__int64 _InterlockedOr64_rel(__int64 volatile *_Value, __int64 _Mask);
++
++/*----------------------------------------------------------------------------*\
++|* Interlocked Xor
++\*----------------------------------------------------------------------------*/
++char _InterlockedXor8_acq(char volatile *_Value, char _Mask);
++char _InterlockedXor8_nf(char volatile *_Value, char _Mask);
++char _InterlockedXor8_rel(char volatile *_Value, char _Mask);
++short _InterlockedXor16_acq(short volatile *_Value, short _Mask);
++short _InterlockedXor16_nf(short volatile *_Value, short _Mask);
++short _InterlockedXor16_rel(short volatile *_Value, short _Mask);
++long _InterlockedXor_acq(long volatile *_Value, long _Mask);
++long _InterlockedXor_nf(long volatile *_Value, long _Mask);
++long _InterlockedXor_rel(long volatile *_Value, long _Mask);
++__int64 _InterlockedXor64_acq(__int64 volatile *_Value, __int64 _Mask);
++__int64 _InterlockedXor64_nf(__int64 volatile *_Value, __int64 _Mask);
++__int64 _InterlockedXor64_rel(__int64 volatile *_Value, __int64 _Mask);
++
++/*----------------------------------------------------------------------------*\
++|* Interlocked Exchange
++\*----------------------------------------------------------------------------*/
++char _InterlockedExchange8_acq(char volatile *_Target, char _Value);
++char _InterlockedExchange8_nf(char volatile *_Target, char _Value);
++char _InterlockedExchange8_rel(char volatile *_Target, char _Value);
++short _InterlockedExchange16_acq(short volatile *_Target, short _Value);
++short _InterlockedExchange16_nf(short volatile *_Target, short _Value);
++short _InterlockedExchange16_rel(short volatile *_Target, short _Value);
++long _InterlockedExchange_acq(long volatile *_Target, long _Value);
++long _InterlockedExchange_nf(long volatile *_Target, long _Value);
++long _InterlockedExchange_rel(long volatile *_Target, long _Value);
++__int64 _InterlockedExchange64_acq(__int64 volatile *_Target, __int64 _Value);
++__int64 _InterlockedExchange64_nf(__int64 volatile *_Target, __int64 _Value);
++__int64 _InterlockedExchange64_rel(__int64 volatile *_Target, __int64 _Value);
++
++/*----------------------------------------------------------------------------*\
++|* Interlocked Compare Exchange
++\*----------------------------------------------------------------------------*/
++char _InterlockedCompareExchange8_acq(char volatile *_Destination,
++ char _Exchange, char _Comparand);
++char _InterlockedCompareExchange8_nf(char volatile *_Destination,
++ char _Exchange, char _Comparand);
++char _InterlockedCompareExchange8_rel(char volatile *_Destination,
++ char _Exchange, char _Comparand);
++short _InterlockedCompareExchange16_acq(short volatile *_Destination,
++ short _Exchange, short _Comparand);
++short _InterlockedCompareExchange16_nf(short volatile *_Destination,
++ short _Exchange, short _Comparand);
++short _InterlockedCompareExchange16_rel(short volatile *_Destination,
++ short _Exchange, short _Comparand);
++long _InterlockedCompareExchange_acq(long volatile *_Destination,
++ long _Exchange, long _Comparand);
++long _InterlockedCompareExchange_nf(long volatile *_Destination, long _Exchange,
++ long _Comparand);
++long _InterlockedCompareExchange_rel(long volatile *_Destination,
++ long _Exchange, long _Comparand);
++__int64 _InterlockedCompareExchange64_acq(__int64 volatile *_Destination,
++ __int64 _Exchange,
++ __int64 _Comparand);
++__int64 _InterlockedCompareExchange64_nf(__int64 volatile *_Destination,
++ __int64 _Exchange, __int64 _Comparand);
++__int64 _InterlockedCompareExchange64_rel(__int64 volatile *_Destination,
++ __int64 _Exchange,
++ __int64 _Comparand);
++#endif
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* __INTRIN0_H */
++#endif /* _MSC_VER */
+diff --git a/clang/lib/Headers/keylockerintrin.h b/clang/lib/Headers/keylockerintrin.h
+index 1994ac42070ad3..f76e91b4d4b306 100644
+--- a/clang/lib/Headers/keylockerintrin.h
++++ b/clang/lib/Headers/keylockerintrin.h
+@@ -28,8 +28,7 @@
+ #ifndef _KEYLOCKERINTRIN_H
+ #define _KEYLOCKERINTRIN_H
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__KL__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__KL__)
+
+ /* Define the default attributes for the functions in this file. */
+ #define __DEFAULT_FN_ATTRS \
+@@ -327,11 +326,9 @@ _mm_aesdec256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {
+
+ #undef __DEFAULT_FN_ATTRS
+
+-#endif /* !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) \
+- || defined(__KL__) */
++#endif /* !defined(__SCE__ || __has_feature(modules) || defined(__KL__) */
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__WIDEKL__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__WIDEKL__)
+
+ /* Define the default attributes for the functions in this file. */
+ #define __DEFAULT_FN_ATTRS \
+@@ -524,7 +521,7 @@ _mm_aesdecwide256kl_u8(__m128i __odata[8], const __m128i __idata[8], const void*
+
+ #undef __DEFAULT_FN_ATTRS
+
+-#endif /* !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) \
+- || defined(__WIDEKL__) */
++#endif /* !defined(__SCE__) || __has_feature(modules) || defined(__WIDEKL__) \
++ */
+
+ #endif /* _KEYLOCKERINTRIN_H */
+diff --git a/clang/lib/Headers/x86gprintrin.h b/clang/lib/Headers/x86gprintrin.h
+index ed141879fbc744..3d5cc606d7e63d 100644
+--- a/clang/lib/Headers/x86gprintrin.h
++++ b/clang/lib/Headers/x86gprintrin.h
+@@ -10,38 +10,31 @@
+ #ifndef __X86GPRINTRIN_H
+ #define __X86GPRINTRIN_H
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__HRESET__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__HRESET__)
+ #include <hresetintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__UINTR__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__UINTR__)
+ #include <uintrintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__USERMSR__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__USERMSR__)
+ #include <usermsrintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__CRC32__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__CRC32__)
+ #include <crc32intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__PRFCHI__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__PRFCHI__)
+ #include <prfchiintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__RAOINT__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__RAOINT__)
+ #include <raointintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__CMPCCXADD__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__CMPCCXADD__)
+ #include <cmpccxaddintrin.h>
+ #endif
+
+diff --git a/clang/lib/Headers/x86intrin.h b/clang/lib/Headers/x86intrin.h
+index 450fd008dab95b..c20bfbb8fe46e2 100644
+--- a/clang/lib/Headers/x86intrin.h
++++ b/clang/lib/Headers/x86intrin.h
+@@ -14,53 +14,43 @@
+
+ #include <immintrin.h>
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__3dNOW__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__3dNOW__)
+ #include <mm3dnow.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__PRFCHW__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__PRFCHW__)
+ #include <prfchwintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__SSE4A__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__SSE4A__)
+ #include <ammintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__FMA4__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__FMA4__)
+ #include <fma4intrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__XOP__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__XOP__)
+ #include <xopintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__TBM__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__TBM__)
+ #include <tbmintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__LWP__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__LWP__)
+ #include <lwpintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__MWAITX__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__MWAITX__)
+ #include <mwaitxintrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__CLZERO__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__CLZERO__)
+ #include <clzerointrin.h>
+ #endif
+
+-#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) || \
+- defined(__RDPRU__)
++#if !defined(__SCE__) || __has_feature(modules) || defined(__RDPRU__)
+ #include <rdpruintrin.h>
+ #endif
+
+diff --git a/clang/lib/Headers/yvals_core.h b/clang/lib/Headers/yvals_core.h
+new file mode 100644
+index 00000000000000..5ee194a3e5f5f6
+--- /dev/null
++++ b/clang/lib/Headers/yvals_core.h
+@@ -0,0 +1,25 @@
++//===----- yvals_core.h - Internal MSVC STL core header -------------------===//
++//
++// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
++// See https://llvm.org/LICENSE.txt for license information.
++// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
++//
++//===----------------------------------------------------------------------===//
++
++// Only include this if we are aiming for MSVC compatibility.
++#ifndef _MSC_VER
++#include_next <yvals_core.h>
++#else
++
++#ifndef __clang_yvals_core_h
++#define __clang_yvals_core_h
++
++#include_next <yvals_core.h>
++
++#ifdef _STL_INTRIN_HEADER
++#undef _STL_INTRIN_HEADER
++#define _STL_INTRIN_HEADER <intrin0.h>
++#endif
++
++#endif
++#endif