More portable, particularly when building with Clang, which implements all MSVC intrisincs in its own intrin.h, but doesn't actually support `#pragma instrinsic`. Reviewed-by: Roland Scheidegger <sroland@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com>tags/12.0-branchpoint
| @@ -50,6 +50,10 @@ | |||
| #include <strings.h> /* for ffs */ | |||
| #endif | |||
| #if defined(_MSC_VER) | |||
| #include <intrin.h> | |||
| #endif | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
| @@ -357,8 +361,6 @@ util_half_inf_sign(int16_t x) | |||
| #define FFS_DEFINED 1 | |||
| #if defined(_MSC_VER) && (_M_IX86 || _M_AMD64 || _M_IA64) | |||
| unsigned char _BitScanForward(unsigned long* Index, unsigned long Mask); | |||
| #pragma intrinsic(_BitScanForward) | |||
| static inline | |||
| unsigned long ffs( unsigned long u ) | |||
| { | |||
| @@ -71,8 +71,7 @@ test_all(unsigned verbose, FILE *fp); | |||
| #if defined(PIPE_CC_MSVC) | |||
| unsigned __int64 __rdtsc(); | |||
| #pragma intrinsic(__rdtsc) | |||
| #include <intrin.h> | |||
| #define rdtsc() __rdtsc() | |||
| #elif defined(PIPE_CC_GCC) && (defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)) | |||
| @@ -48,6 +48,8 @@ | |||
| #if defined(_MSC_VER) | |||
| #include <intrin.h> | |||
| /* Avoid 'expression is always true' warning */ | |||
| #pragma warning(disable: 4296) | |||
| @@ -174,8 +176,6 @@ typedef unsigned char boolean; | |||
| #elif defined(_MSC_VER) | |||
| void _ReadWriteBarrier(void); | |||
| #pragma intrinsic(_ReadWriteBarrier) | |||
| #define PIPE_READ_WRITE_BARRIER() _ReadWriteBarrier() | |||
| #else | |||