aboutsummaryrefslogtreecommitdiff
path: root/src/helper
diff options
context:
space:
mode:
authorAndreas Fritiofson <andreas.fritiofson@gmail.com>2014-02-17 00:27:09 +0100
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2014-06-28 09:27:19 +0000
commit36772a7ed0c31a99c721d1ea9131a8ecc56a263d (patch)
treefe43ec6bfe5fa5a15f1733410d56b8e0c9db456c /src/helper
parent0e95ec4070258649f2638780581f61a1082d171c (diff)
downloadriscv-openocd-36772a7ed0c31a99c721d1ea9131a8ecc56a263d.zip
riscv-openocd-36772a7ed0c31a99c721d1ea9131a8ecc56a263d.tar.gz
riscv-openocd-36772a7ed0c31a99c721d1ea9131a8ecc56a263d.tar.bz2
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.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/helper/types.h b/src/helper/types.h
index 210d3c3..3f0724c 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