diff --git a/sdk/include/crt/mingw32/intrin.h b/sdk/include/crt/mingw32/intrin.h index d1377939f46..c7c6b6a0d29 100644 --- a/sdk/include/crt/mingw32/intrin.h +++ b/sdk/include/crt/mingw32/intrin.h @@ -30,13 +30,21 @@ #ifndef RC_INVOKED -#ifdef __clang__ -#define __INTRIN_INLINE __forceinline -#define HAS_BUILTIN(x) __has_builtin(x) -#else -#define HAS_BUILTIN(x) 0 -#define __ATTRIBUTE_ARTIFICIAL __attribute__((artificial)) -#define __INTRIN_INLINE extern __inline__ __attribute__((__always_inline__,__gnu_inline__)) __ATTRIBUTE_ARTIFICIAL +#ifndef __INTRIN_INLINE +# ifdef __clang__ +# define __ATTRIBUTE_ARTIFICIAL +# else +# define __ATTRIBUTE_ARTIFICIAL __attribute__((artificial)) +# endif +# define __INTRIN_INLINE extern __inline__ __attribute__((__always_inline__,__gnu_inline__)) __ATTRIBUTE_ARTIFICIAL +#endif + +#ifndef HAS_BUILTIN +# ifdef __clang__ +# define HAS_BUILTIN(x) __has_builtin(x) +# else +# define HAS_BUILTIN(x) 0 +# endif #endif #ifndef _SIZE_T_DEFINED diff --git a/sdk/include/crt/mingw32/intrin_x86.h b/sdk/include/crt/mingw32/intrin_x86.h index 424bbc61d06..600402bce66 100644 --- a/sdk/include/crt/mingw32/intrin_x86.h +++ b/sdk/include/crt/mingw32/intrin_x86.h @@ -133,15 +133,19 @@ __INTRIN_INLINE void __faststorefence(void) #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) > 40100 +#if !HAS_BUILTIN(_InterlockedCompareExchange8) __INTRIN_INLINE char _InterlockedCompareExchange8(volatile char * Destination, char Exchange, char Comperand) { return __sync_val_compare_and_swap(Destination, Comperand, Exchange); } +#endif +#if !HAS_BUILTIN(_InterlockedCompareExchange16) __INTRIN_INLINE short _InterlockedCompareExchange16(volatile short * Destination, short Exchange, short Comperand) { return __sync_val_compare_and_swap(Destination, Comperand, Exchange); } +#endif #if !HAS_BUILTIN(_InterlockedCompareExchange) __INTRIN_INLINE long __cdecl _InterlockedCompareExchange(volatile long * Destination, long Exchange, long Comperand) @@ -157,19 +161,23 @@ __INTRIN_INLINE void * _InterlockedCompareExchangePointer(void * volatile * Dest } #endif +#if !HAS_BUILTIN(_InterlockedExchange8) __INTRIN_INLINE char _InterlockedExchange8(volatile char * Target, char Value) { /* NOTE: __sync_lock_test_and_set would be an acquire barrier, so we force a full barrier */ __sync_synchronize(); return __sync_lock_test_and_set(Target, Value); } +#endif +#if !HAS_BUILTIN(_InterlockedExchange16) __INTRIN_INLINE short _InterlockedExchange16(volatile short * Target, short Value) { /* NOTE: __sync_lock_test_and_set would be an acquire barrier, so we force a full barrier */ __sync_synchronize(); return __sync_lock_test_and_set(Target, Value); } +#endif #if !HAS_BUILTIN(_InterlockedExchange) __INTRIN_INLINE long __cdecl _InterlockedExchange(volatile long * Target, long Value) @@ -198,15 +206,19 @@ __INTRIN_INLINE long long _InterlockedExchange64(volatile long long * Target, lo } #endif +#if !HAS_BUILTIN(_InterlockedExchangeAdd8) __INTRIN_INLINE char _InterlockedExchangeAdd8(char volatile * Addend, char Value) { return __sync_fetch_and_add(Addend, Value); } +#endif +#if !HAS_BUILTIN(_InterlockedExchangeAdd16) __INTRIN_INLINE short _InterlockedExchangeAdd16(volatile short * Addend, short Value) { return __sync_fetch_and_add(Addend, Value); } +#endif #if !HAS_BUILTIN(_InterlockedExchangeAdd) __INTRIN_INLINE long __cdecl _InterlockedExchangeAdd(volatile long * Addend, long Value) @@ -222,20 +234,26 @@ __INTRIN_INLINE long long _InterlockedExchangeAdd64(volatile long long * Addend, } #endif +#if !HAS_BUILTIN(_InterlockedAnd8) __INTRIN_INLINE char _InterlockedAnd8(volatile char * value, char mask) { return __sync_fetch_and_and(value, mask); } +#endif +#if !HAS_BUILTIN(_InterlockedAnd16) __INTRIN_INLINE short _InterlockedAnd16(volatile short * value, short mask) { return __sync_fetch_and_and(value, mask); } +#endif +#if !HAS_BUILTIN(_InterlockedAnd) __INTRIN_INLINE long _InterlockedAnd(volatile long * value, long mask) { return __sync_fetch_and_and(value, mask); } +#endif #if defined(__x86_64__) __INTRIN_INLINE long long _InterlockedAnd64(volatile long long * value, long long mask) @@ -244,20 +262,26 @@ __INTRIN_INLINE long long _InterlockedAnd64(volatile long long * value, long lon } #endif +#if !HAS_BUILTIN(_InterlockedOr8) __INTRIN_INLINE char _InterlockedOr8(volatile char * value, char mask) { return __sync_fetch_and_or(value, mask); } +#endif +#if !HAS_BUILTIN(_InterlockedOr16) __INTRIN_INLINE short _InterlockedOr16(volatile short * value, short mask) { return __sync_fetch_and_or(value, mask); } +#endif +#if !HAS_BUILTIN(_InterlockedOr) __INTRIN_INLINE long _InterlockedOr(volatile long * value, long mask) { return __sync_fetch_and_or(value, mask); } +#endif #if defined(__x86_64__) __INTRIN_INLINE long long _InterlockedOr64(volatile long long * value, long long mask) @@ -266,20 +290,26 @@ __INTRIN_INLINE long long _InterlockedOr64(volatile long long * value, long long } #endif +#if !HAS_BUILTIN(_InterlockedXor8) __INTRIN_INLINE char _InterlockedXor8(volatile char * value, char mask) { return __sync_fetch_and_xor(value, mask); } +#endif +#if !HAS_BUILTIN(_InterlockedXor16) __INTRIN_INLINE short _InterlockedXor16(volatile short * value, short mask) { return __sync_fetch_and_xor(value, mask); } +#endif +#if !HAS_BUILTIN(_InterlockedXor) __INTRIN_INLINE long _InterlockedXor(volatile long * value, long mask) { return __sync_fetch_and_xor(value, mask); } +#endif #if defined(__x86_64__) __INTRIN_INLINE long long _InterlockedXor64(volatile long long * value, long long mask) @@ -302,15 +332,19 @@ __INTRIN_INLINE long __cdecl _InterlockedIncrement(volatile long * lpAddend) } #endif +#if !HAS_BUILTIN(_InterlockedDecrement16) __INTRIN_INLINE short _InterlockedDecrement16(volatile short * lpAddend) { return __sync_sub_and_fetch(lpAddend, 1); } +#endif +#if !HAS_BUILTIN(_InterlockedIncrement16) __INTRIN_INLINE short _InterlockedIncrement16(volatile short * lpAddend) { return __sync_add_and_fetch(lpAddend, 1); } +#endif #if defined(__x86_64__) __INTRIN_INLINE long long _InterlockedDecrement64(volatile long long * lpAddend) @@ -1696,13 +1730,6 @@ __INTRIN_INLINE void __writecr4(unsigned int Data) __asm__("mov %[Data], %%cr4" : : [Data] "r" (Data) : "memory"); } -#if !HAS_BUILTIN(__writecr8) -__INTRIN_INLINE void __writecr8(unsigned int Data) -{ - __asm__("mov %[Data], %%cr8" : : [Data] "r" (Data) : "memory"); -} -#endif - __INTRIN_INLINE unsigned long __readcr0(void) { unsigned long value; @@ -1731,15 +1758,6 @@ __INTRIN_INLINE unsigned long __readcr4(void) return value; } -#if !HAS_BUILTIN(__readcr8) -__INTRIN_INLINE unsigned long __readcr8(void) -{ - unsigned long value; - __asm__ __volatile__("mov %%cr8, %[value]" : [value] "=r" (value)); - return value; -} -#endif - #endif /* __x86_64__ */ #ifdef __x86_64__ diff --git a/sdk/include/crt/xmmintrin.h b/sdk/include/crt/xmmintrin.h index d84f8350a1f..61ed2c9dcf6 100644 --- a/sdk/include/crt/xmmintrin.h +++ b/sdk/include/crt/xmmintrin.h @@ -55,49 +55,62 @@ void _mm_setcsr(unsigned int); #ifndef __clang__ #pragma intrinsic(_mm_xor_ps) #pragma intrinsic(_mm_div_ps) +#else + +/* + * Clang implements these as inline functions in the header instead of real builtins + */ +__forceinline __m128 _mm_xor_ps(__m128 a, __m128 b) +{ + return (__m128)((__v4su)a ^ (__v4su)b); +} + +__forceinline __m128 _mm_div_ps(__m128 a, __m128 b) +{ + return (__m128)((__v4sf)a / (__v4sf)b); +} #endif /* __clang__ */ #else /* _MSC_VER */ -#if !defined(__INTRIN_INLINE) && !defined(__clang__) -#define __ATTRIBUTE_ARTIFICIAL __attribute__((artificial)) -#define __INTRIN_INLINE extern __inline__ __attribute__((__always_inline__,__gnu_inline__)) __ATTRIBUTE_ARTIFICIAL -#endif /* !__INTRIN_INLINE && !__clang__ */ +#if !defined(__INTRIN_INLINE) +# ifdef __clang__ +# define __ATTRIBUTE_ARTIFICIAL +# else +# define __ATTRIBUTE_ARTIFICIAL __attribute__((artificial)) +# endif +# define __INTRIN_INLINE extern __inline__ __attribute__((__always_inline__,__gnu_inline__)) __ATTRIBUTE_ARTIFICIAL +#endif /* !__INTRIN_INLINE */ -/* +#ifndef HAS_BUILTIN +#ifdef __clang__ +#define HAS_BUILTIN(x) __has_builtin(x) +#else +#define HAS_BUILTIN(x) 0 +#endif +#endif + +/* * We can't use __builtin_ia32_* functions, * are they are only available with the -msse2 compiler switch */ +#if !HAS_BUILTIN(_mm_getcsr) __INTRIN_INLINE unsigned int _mm_getcsr(void) { unsigned int retval; __asm__ __volatile__("stmxcsr %0" : "=m"(retval)); return retval; } +#endif +#if !HAS_BUILTIN(_mm_setcsr) __INTRIN_INLINE void _mm_setcsr(unsigned int val) { __asm__ __volatile__("ldmxcsr %0" : : "m"(val)); } +#endif #endif /* _MSC_VER */ -#ifdef __clang__ -#define __INTRIN_INLINE __forceinline - -/* - * Clang implements these as inline functions in the header instead of real builtins - */ -__INTRIN_INLINE __m128 _mm_xor_ps(__m128 a, __m128 b) -{ - return (__m128)((__v4su)a ^ (__v4su)b); -} - -__INTRIN_INLINE __m128 _mm_div_ps(__m128 a, __m128 b) -{ - return (__m128)((__v4sf)a / (__v4sf)b); -} -#endif /* __clang__ */ - /* Alternate names */ #define _mm_cvtss_si32 _mm_cvt_ss2si