diff options
author | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2014-02-17 00:27:09 +0100 |
---|---|---|
committer | Andreas Fritiofson <andreas.fritiofson@gmail.com> | 2014-06-28 09:27:19 +0000 |
commit | 36772a7ed0c31a99c721d1ea9131a8ecc56a263d (patch) | |
tree | fe43ec6bfe5fa5a15f1733410d56b8e0c9db456c /src/helper | |
parent | 0e95ec4070258649f2638780581f61a1082d171c (diff) |
swd: Improve parity calculation and move it to types.h
It could be reused by SWD drivers and in other places.
Change-Id: Ieed0cf70c111a73d3a42ed59f46a0cdd177a73d5
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/1957
Tested-by: jenkins
Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Diffstat (limited to 'src/helper')
-rw-r--r-- | src/helper/types.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/helper/types.h b/src/helper/types.h index 210d3c3e..3f0724c3 100644 --- a/src/helper/types.h +++ b/src/helper/types.h @@ -270,6 +270,25 @@ static inline void buf_bswap32(uint8_t *dst, const uint8_t *src, size_t len) } } +/** + * Calculate the (even) parity of a 32-bit datum. + * @param x The datum. + * @return 1 if the number of set bits in x is odd, 0 if it is even. + */ +static inline int parity_u32(uint32_t x) +{ +#ifdef __GNUC__ + return __builtin_parityl(x); +#else + x ^= x >> 16; + x ^= x >> 8; + x ^= x >> 4; + x ^= x >> 2; + x ^= x >> 1; + return x & 1; +#endif +} + #if defined(__ECOS) /* eCos plain lacks these definition... A series of upstream patches |