[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] xen/include: add macro ISOLATE_LSB
commit b739e2067b1a06328e7f0042630b543413689eac Author: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> AuthorDate: Thu Nov 16 09:18:23 2023 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Thu Nov 16 09:18:23 2023 +0100 xen/include: add macro ISOLATE_LSB The purpose of this macro is to encapsulate the well-known expression 'x & -x' that in 2's complement architectures on unsigned integers will give a mask where only the least significant nonzero bit of 'x' is set, or 0 if none are set. A deviation for ECLAIR is also introduced. Signed-off-by: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> --- automation/eclair_analysis/ECLAIR/deviations.ecl | 7 +++++++ docs/misra/deviations.rst | 8 ++++++++ xen/include/xen/macros.h | 10 ++++++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/automation/eclair_analysis/ECLAIR/deviations.ecl b/automation/eclair_analysis/ECLAIR/deviations.ecl index d8170106b4..82ae567da4 100644 --- a/automation/eclair_analysis/ECLAIR/deviations.ecl +++ b/automation/eclair_analysis/ECLAIR/deviations.ecl @@ -274,6 +274,13 @@ still non-negative." -config=MC3R1.R10.1,etypes+={safe, "stmt(operator(logical)||node(conditional_operator||binary_conditional_operator))", "dst_type(ebool||boolean)"} -doc_end +-doc_begin="The macro ISOLATE_LSB encapsulates a well-known pattern to obtain +a mask where only the lowest bit set in the argument is set, if any, for unsigned +integers arguments on two's complement architectures +(all the architectures supported by Xen satisfy this requirement)." +-config=MC3R1.R10.1,reports+={safe, "any_area(any_loc(any_exp(macro(^ISOLATE_LSB$))))"} +-doc_end + ### Set 3 ### # diff --git a/docs/misra/deviations.rst b/docs/misra/deviations.rst index 8511a18925..5b03c093ad 100644 --- a/docs/misra/deviations.rst +++ b/docs/misra/deviations.rst @@ -192,6 +192,14 @@ Deviations related to MISRA C:2012 Rules: See automation/eclair_analysis/deviations.ecl for the full explanation. - Tagged as `safe` for ECLAIR. + * - R10.1 + - The macro ISOLATE_LSB encapsulates the well-known pattern (x & -x) + applied to unsigned integer values on 2's complement architectures + (i.e., all architectures supported by Xen), used to obtain a mask where + just the least significant nonzero bit of x is set. + If no bits are set, 0 is returned. + - Tagged as `safe` for ECLAIR. + * - R13.5 - All developers and reviewers can be safely assumed to be well aware of the short-circuit evaluation strategy for logical operators. diff --git a/xen/include/xen/macros.h b/xen/include/xen/macros.h index d0caae7db2..f943319ab2 100644 --- a/xen/include/xen/macros.h +++ b/xen/include/xen/macros.h @@ -8,8 +8,14 @@ #define DIV_ROUND(n, d) (((n) + (d) / 2) / (d)) #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) -#define MASK_EXTR(v, m) (((v) & (m)) / ((m) & -(m))) -#define MASK_INSR(v, m) (((v) * ((m) & -(m))) & (m)) +/* + * Given an unsigned integer argument, expands to a mask where just the least + * significant nonzero bit of the argument is set, or 0 if no bits are set. + */ +#define ISOLATE_LSB(x) ((x) & -(x)) + +#define MASK_EXTR(v, m) (((v) & (m)) / ISOLATE_LSB(m)) +#define MASK_INSR(v, m) (((v) * ISOLATE_LSB(m)) & (m)) #define count_args_(dot, a1, a2, a3, a4, a5, a6, a7, a8, x, ...) x #define count_args(args...) \ -- generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |