https://git.reactos.org/?p=reactos.git;a=commitdiff;h=12139bcde7825ce1a1b75933a90af543ad348b78
commit 12139bcde7825ce1a1b75933a90af543ad348b78 Author: Timo Kreuzer <timo.kreu...@reactos.org> AuthorDate: Wed Nov 27 16:26:17 2024 +0200 Commit: Timo Kreuzer <timo.kreu...@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();