summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@google.com>2021-09-24 09:37:27 -0600
committerCommit Bot <commit-bot@chromium.org>2021-09-27 23:15:52 +0000
commit43e1a59c047bd28917251d13e47e00594624b277 (patch)
tree10d995002f921fb35c73c00ccc2f152884a1cddd /common
parentb6afc9e875cc6494ed6adb79c579f73093cff0c2 (diff)
downloadchrome-ec-43e1a59c047bd28917251d13e47e00594624b277.tar.gz
math_util: add creation of 64 bit bitmasks
32 bit processors don't all allow left shift of 64 bit values. So add this to make it work with 32 and 64 bit processors. uint64_t bitmask_uint64(int offset); BUG=none BRANCH=none TEST=make buildall Signed-off-by: Denis Brockus <dbrockus@google.com> Change-Id: I114111c4774bb935a35c7711821b1f2f2f9c037d Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3182630 Tested-by: Denis Brockus <dbrockus@chromium.org> Auto-Submit: Denis Brockus <dbrockus@chromium.org> Commit-Queue: Yuval Peress <peress@google.com> Reviewed-by: Yuval Peress <peress@google.com>
Diffstat (limited to 'common')
-rw-r--r--common/math_util.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/common/math_util.c b/common/math_util.c
index 8e07b678a5..52b0879626 100644
--- a/common/math_util.c
+++ b/common/math_util.c
@@ -293,3 +293,43 @@ int round_divide(int64_t dividend, int divisor)
(dividend - divisor / 2) / divisor :
(dividend + divisor / 2) / divisor;
}
+
+#if ULONG_MAX == 0xFFFFFFFFUL
+/*
+ * 32 bit processor
+ *
+ * Some 32 bit processors do not include a 64 bit shift
+ * operation. So fall back to 32 bit operations on a
+ * union.
+ */
+uint64_t bitmask_uint64(int offset)
+{
+ union mask64_t {
+ struct {
+#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
+ uint32_t lo;
+ uint32_t hi;
+#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
+ uint32_t hi;
+ uint32_t lo;
+#endif
+ };
+ uint64_t val;
+ } mask;
+
+ /* Clear out the mask */
+ mask.val = 0;
+
+ /*
+ * If the shift is out of range the result should
+ * remain 0, otherwise perform the shift
+ */
+ if (offset >= 0 && offset < 64) {
+ if (offset < 32)
+ mask.lo = BIT(offset);
+ else
+ mask.hi = BIT(offset - 32);
+ }
+ return mask.val;
+}
+#endif