mirror of
https://github.com/reactos/reactos.git
synced 2025-07-29 08:31:57 +00:00
[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
This commit is contained in:
parent
78417c5532
commit
12139bcde7
2 changed files with 34 additions and 11 deletions
|
@ -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));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue