https://git.reactos.org/?p=reactos.git;a=commitdiff;h=12139bcde7825ce1a1b75…
commit 12139bcde7825ce1a1b75933a90af543ad348b78
Author: Timo Kreuzer <timo.kreuzer(a)reactos.org>
AuthorDate: Wed Nov 27 16:26:17 2024 +0200
Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org>
CommitDate: Tue Jan 14 13:34:24 2025 +0200
[VCRUNTIME] Fix some intrinsics with clang-cl 17
For some unknow reason some intrinsics fail to get inlined. Using extern inline results in a linker error. Change it to static inline, so that there is a static implementation in case it doesn't get inlined
---
sdk/include/vcruntime/mingw32/intrin_x86.h | 39 ++++++++++++++++++++++++------
sdk/include/vcruntime/xmmintrin.h | 6 ++---
2 files changed, 34 insertions(+), 11 deletions(-)
diff --git a/sdk/include/vcruntime/mingw32/intrin_x86.h b/sdk/include/vcruntime/mingw32/intrin_x86.h
index f6300702b40..429b4896a03 100644
--- a/sdk/include/vcruntime/mingw32/intrin_x86.h
+++ b/sdk/include/vcruntime/mingw32/intrin_x86.h
@@ -95,14 +95,14 @@ __INTRIN_INLINE void _ReadWriteBarrier(void)
#define _ReadBarrier _ReadWriteBarrier
#define _WriteBarrier _ReadWriteBarrier
-#if !HAS_BUILTIN(_mm_mfence)
+#if !HAS_BUILTIN(_mm_mfence) && !defined(__clang__)
__INTRIN_INLINE void _mm_mfence(void)
{
__asm__ __volatile__("mfence" : : : "memory");
}
#endif
-#if !HAS_BUILTIN(_mm_lfence)
+#if !HAS_BUILTIN(_mm_lfence)&& !defined(__clang__)
__INTRIN_INLINE void _mm_lfence(void)
{
_ReadBarrier();
@@ -1301,8 +1301,13 @@ __INTRIN_INLINE unsigned long __cdecl _lrotr(unsigned long value, int shift)
}
#endif
-#ifdef __x86_64__
-__INTRIN_INLINE unsigned long long __ll_lshift(unsigned long long Mask, int Bit)
+#if defined __x86_64__
+#if defined(__clang__) && defined(_MSC_VER) // stupid hack because clang is broken
+static inline __attribute__((__always_inline__))
+#else
+__INTRIN_INLINE
+#endif
+unsigned long long __ll_lshift(unsigned long long Mask, int Bit)
{
unsigned long long retval;
unsigned char shift = Bit & 0x3F;
@@ -1348,7 +1353,12 @@ __INTRIN_INLINE unsigned long long __ull_rshift(unsigned long long Mask, int Bit
just confuses it. Also we declare Bit as an int and then truncate it to
match Visual C++ behavior
*/
-__INTRIN_INLINE unsigned long long __ll_lshift(unsigned long long Mask, int Bit)
+#if defined(__clang__) && defined(_MSC_VER) // stupid hack because clang is broken
+static inline __attribute__((__always_inline__))
+#else
+__INTRIN_INLINE
+#endif
+unsigned long long __ll_lshift(unsigned long long Mask, int Bit)
{
unsigned long long retval = Mask;
@@ -1641,15 +1651,19 @@ __INTRIN_INLINE unsigned long __cdecl _outpd(unsigned short Port, unsigned long
/*** System information ***/
+#if !HAS_BUILTIN(__cpuid)
__INTRIN_INLINE void __cpuid(int CPUInfo[4], int InfoType)
{
__asm__ __volatile__("cpuid" : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "a" (InfoType));
}
+#endif
+#if !HAS_BUILTIN(__cpuidex)
__INTRIN_INLINE void __cpuidex(int CPUInfo[4], int InfoType, int ECXValue)
{
__asm__ __volatile__("cpuid" : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3]) : "a" (InfoType), "c" (ECXValue));
}
+#endif
#if !HAS_BUILTIN(__rdtsc)
__INTRIN_INLINE unsigned long long __rdtsc(void)
@@ -1972,8 +1986,12 @@ __INTRIN_INLINE void __invlpg(void *Address)
/*** System operations ***/
-
-__INTRIN_INLINE unsigned long long __readmsr(unsigned long reg)
+#if defined(__clang__) && defined(_MSC_VER) // stupid hack because clang is broken
+static inline __attribute__((__always_inline__))
+#else
+__INTRIN_INLINE
+#endif
+unsigned long long __readmsr(unsigned long reg)
{
#ifdef __x86_64__
unsigned long low, high;
@@ -1986,7 +2004,12 @@ __INTRIN_INLINE unsigned long long __readmsr(unsigned long reg)
#endif
}
-__INTRIN_INLINE void __writemsr(unsigned long Register, unsigned long long Value)
+#if defined(__clang__) && defined(_MSC_VER) // stupid hack because clang is broken
+static inline __attribute__((__always_inline__))
+#else
+__INTRIN_INLINE
+#endif
+void __writemsr(unsigned long Register, unsigned long long Value)
{
#ifdef __x86_64__
__asm__ __volatile__("wrmsr" : : "a" (Value), "d" (Value >> 32), "c" (Register));
diff --git a/sdk/include/vcruntime/xmmintrin.h b/sdk/include/vcruntime/xmmintrin.h
index 224cbc25f1b..37c7fefd105 100644
--- a/sdk/include/vcruntime/xmmintrin.h
+++ b/sdk/include/vcruntime/xmmintrin.h
@@ -531,14 +531,14 @@ do { \
/* Use inline functions on GCC/Clang */
-#if !HAS_BUILTIN(_mm_getcsr)
+#if !HAS_BUILTIN(_mm_getcsr) && !defined(_MSC_VER)
__INTRIN_INLINE_SSE unsigned int _mm_getcsr(void)
{
return __builtin_ia32_stmxcsr();
}
#endif
-#if !HAS_BUILTIN(_mm_setcsr)
+#if !HAS_BUILTIN(_mm_setcsr) && !defined(_MSC_VER)
__INTRIN_INLINE_SSE void _mm_setcsr(unsigned int a)
{
__builtin_ia32_ldmxcsr(a);
@@ -1136,7 +1136,7 @@ __INTRIN_INLINE_SSE void _mm_stream_ps(float *__p, __m128 __a)
#endif
}
-#if !HAS_BUILTIN(_mm_sfence)
+#if !HAS_BUILTIN(_mm_sfence) && !defined(_MSC_VER)
__INTRIN_INLINE_SSE void _mm_sfence(void)
{
__builtin_ia32_sfence();