diff options
Diffstat (limited to 'vcpkg/ports/llvm/75711.patch')
| -rw-r--r-- | vcpkg/ports/llvm/75711.patch | 1350 |
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 |