diff options
Diffstat (limited to 'src/osd/eivc.h')
-rw-r--r-- | src/osd/eivc.h | 100 |
1 files changed, 92 insertions, 8 deletions
diff --git a/src/osd/eivc.h b/src/osd/eivc.h index 3fa34f51b3c..5c41726d2b1 100644 --- a/src/osd/eivc.h +++ b/src/osd/eivc.h @@ -14,21 +14,27 @@ #pragma once #include <intrin.h> +#include <stdlib.h> + #pragma intrinsic(_BitScanReverse) +#if defined(_M_X64) || defined(_M_ARM64) +#pragma intrinsic(_BitScanReverse64) +#endif + /*************************************************************************** INLINE BIT MANIPULATION FUNCTIONS ***************************************************************************/ /*------------------------------------------------- - count_leading_zeros - return the number of + count_leading_zeros_32 - return the number of leading zero bits in a 32-bit value -------------------------------------------------*/ -#ifndef count_leading_zeros -#define count_leading_zeros _count_leading_zeros -inline uint8_t _count_leading_zeros(uint32_t value) +#ifndef count_leading_zeros_32 +#define count_leading_zeros_32 _count_leading_zeros_32 +__forceinline uint8_t _count_leading_zeros_32(uint32_t value) { unsigned long index; return _BitScanReverse(&index, value) ? (31U - index) : 32U; @@ -37,17 +43,95 @@ inline uint8_t _count_leading_zeros(uint32_t value) /*------------------------------------------------- - count_leading_ones - return the number of + count_leading_ones_32 - return the number of leading one bits in a 32-bit value -------------------------------------------------*/ -#ifndef count_leading_ones -#define count_leading_ones _count_leading_ones -inline uint8_t _count_leading_ones(uint32_t value) +#ifndef count_leading_ones_32 +#define count_leading_ones_32 _count_leading_ones_32 +__forceinline uint8_t _count_leading_ones_32(uint32_t value) { unsigned long index; return _BitScanReverse(&index, ~value) ? (31U - index) : 32U; } #endif + +/*------------------------------------------------- + count_leading_zeros_64 - return the number of + leading zero bits in a 64-bit value +-------------------------------------------------*/ + +#ifndef count_leading_zeros_64 +#define count_leading_zeros_64 _count_leading_zeros_64 +__forceinline uint8_t _count_leading_zeros_64(uint64_t value) +{ + unsigned long index; +#if defined(_M_X64) || defined(_M_ARM64) + return _BitScanReverse64(&index, value) ? (63U - index) : 64U; +#else + return _BitScanReverse(&index, uint32_t(value >> 32)) ? (31U - index) : _BitScanReverse(&index, uint32_t(value)) ? (63U - index) : 64U; +#endif +} +#endif + + +/*------------------------------------------------- + count_leading_ones_64 - return the number of + leading one bits in a 64-bit value +-------------------------------------------------*/ + +#ifndef count_leading_ones_64 +#define count_leading_ones_64 _count_leading_ones_64 +__forceinline uint8_t _count_leading_ones_64(uint64_t value) +{ + unsigned long index; +#if defined(_M_X64) || defined(_M_ARM64) + return _BitScanReverse64(&index, ~value) ? (63U - index) : 64U; +#else + return _BitScanReverse(&index, ~uint32_t(value >> 32)) ? (31U - index) : _BitScanReverse(&index, ~uint32_t(value)) ? (63U - index) : 64U; +#endif +} +#endif + + +/*------------------------------------------------- + rotl_32 - circularly shift a 32-bit value left + by the specified number of bits (modulo 32) +-------------------------------------------------*/ + +#ifndef rotl_32 +#define rotl_32 _rotl +#endif + + +/*------------------------------------------------- + rotr_32 - circularly shift a 32-bit value right + by the specified number of bits (modulo 32) +-------------------------------------------------*/ + +#ifndef rotr_32 +#define rotr_32 _rotr +#endif + + +/*------------------------------------------------- + rotl_64 - circularly shift a 64-bit value left + by the specified number of bits (modulo 64) +-------------------------------------------------*/ + +#ifndef rotl_64 +#define rotl_64 _rotl64 +#endif + + +/*------------------------------------------------- + rotr_64 - circularly shift a 64-bit value right + by the specified number of bits (modulo 64) +-------------------------------------------------*/ + +#ifndef rotr_64 +#define rotr_64 _rotr64 +#endif + #endif // MAME_OSD_EIVC_H |