From 36772a7ed0c31a99c721d1ea9131a8ecc56a263d Mon Sep 17 00:00:00 2001 From: Andreas Fritiofson Date: Mon, 17 Feb 2014 00:27:09 +0100 Subject: 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 Reviewed-on: http://openocd.zylin.com/1957 Tested-by: jenkins Reviewed-by: Paul Fertser --- src/helper/types.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/helper') 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 -- cgit v1.2.3-18-g5258