mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2024-09-23 22:54:47 +00:00
Allow fallback for where intrinsics aren't available.
Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
This commit is contained in:
parent
55b989fe13
commit
def14493cb
@ -1,5 +1,30 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
namespace EightBit {
|
||||||
|
int countBits(uint8_t value);
|
||||||
|
bool oddParity(uint8_t value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Published in 1988, the C Programming Language 2nd Ed.
|
||||||
|
(by Brian W.Kernighan and Dennis M.Ritchie) mentions
|
||||||
|
this in exercise 2 - 9. On April 19, 2006 Don Knuth pointed
|
||||||
|
out to me that this method "was first published by Peter
|
||||||
|
Wegner in CACM 3 (1960), 322.
|
||||||
|
(Also discovered independently by Derrick Lehmer and published
|
||||||
|
in 1964 in a book edited by Beckenbach.)"
|
||||||
|
*/
|
||||||
|
inline int EightBit::countBits(uint8_t value) {
|
||||||
|
int count; // c accumulates the total bits set in value
|
||||||
|
for (count = 0; value; ++count)
|
||||||
|
value &= value - 1; // clear the least significant bit set
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool EightBit::oddParity(uint8_t value) {
|
||||||
|
return countBits(value) % 2;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
|
||||||
# include <intrin.h>
|
# include <intrin.h>
|
||||||
@ -7,7 +32,7 @@
|
|||||||
# define LIKELY(x) (x)
|
# define LIKELY(x) (x)
|
||||||
# define UNLIKELY(x) (x)
|
# define UNLIKELY(x) (x)
|
||||||
|
|
||||||
# define EIGHTBIT_PARITY(x) (__popcnt(value) % 2)
|
# define EIGHTBIT_PARITY(x) (__popcnt(x) % 2)
|
||||||
|
|
||||||
# define UNREACHABLE __assume(0)
|
# define UNREACHABLE __assume(0)
|
||||||
|
|
||||||
@ -23,5 +48,12 @@
|
|||||||
# define UNREACHABLE __builtin_unreachable();
|
# define UNREACHABLE __builtin_unreachable();
|
||||||
|
|
||||||
#else
|
#else
|
||||||
# error Unknown compiler
|
|
||||||
|
# define LIKELY(x) (x)
|
||||||
|
# define UNLIKELY(x) (x)
|
||||||
|
|
||||||
|
# define EIGHTBIT_PARITY(x) EightBit::oddParity(x)
|
||||||
|
|
||||||
|
# define UNREACHABLE
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user