Allow fallback for where intrinsics aren't available.

Signed-off-by: Adrian Conlon <Adrian.conlon@gmail.com>
This commit is contained in:
Adrian Conlon 2017-12-02 19:01:07 +00:00
parent 55b989fe13
commit def14493cb

View File

@ -1,5 +1,30 @@
#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
# include <intrin.h>
@ -7,7 +32,7 @@
# define LIKELY(x) (x)
# define UNLIKELY(x) (x)
# define EIGHTBIT_PARITY(x) (__popcnt(value) % 2)
# define EIGHTBIT_PARITY(x) (__popcnt(x) % 2)
# define UNREACHABLE __assume(0)
@ -23,5 +48,12 @@
# define UNREACHABLE __builtin_unreachable();
#else
# error Unknown compiler
# define LIKELY(x) (x)
# define UNLIKELY(x) (x)
# define EIGHTBIT_PARITY(x) EightBit::oddParity(x)
# define UNREACHABLE
#endif