diff options
author | Denis Brockus <dbrockus@google.com> | 2021-09-24 09:37:27 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-09-27 23:15:52 +0000 |
commit | 43e1a59c047bd28917251d13e47e00594624b277 (patch) | |
tree | 10d995002f921fb35c73c00ccc2f152884a1cddd /common | |
parent | b6afc9e875cc6494ed6adb79c579f73093cff0c2 (diff) | |
download | chrome-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.c | 40 |
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 |