[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: Devise macros to encapsulate (x & -x)
On 2023-11-17 12:39, Jan Beulich wrote: On 17.11.2023 11:17, Nicola Vetrini wrote:Hi all, As discussed in this thread [1], which is about complying with MISRA C Rule 10.1, a macro was introduced to encapsulate a well-known construct: /** Given an unsigned integer argument, expands to a mask where just theleast* significant nonzero bit of the argument is set, or 0 if no bits areset. */ #define ISOLATE_LSB(x) ((x) & -(x)) This macro has a gained some calls in the subsequent patches in thatthread, but concerns were raised around the fact that it would be betterto devise a macro that evaluates its argument only once. A proposed solution is this (thanks to Jan Beulich): #define ISOLATE_LSB(x) ({ \ typeof(x) x_ = (x); \ x_ & -x_; \ }) However, it can't be used in all call sites that the previous macro would have once that series is committed, as can be seen in [2]. Therefore, while the implementation looks ok, a case has been made to have separate macros, of which the latter form is preferred. The following points require some thought: - where the single evaluation macro should be placed? One proposed location is xen/include/xen/bitops.hOr next to the existing one in macros.h. I can see pros and cons for either.- is the proposed form actually the best, or maybe it could be an inlinefunction?How would you make such a function type generic? Ah, yes indeed this wouldn't work. -- Nicola Vetrini, BSc Software Engineer, BUGSENG srl (https://bugseng.com)
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |