Re: [RFC][PATCH] new byteorder primitives - ..._{replace,get}_bits()
flat view
From: Al Viro <viro@ZenIV.linux.org.uk>
Date: 2017-12-13 01:30:59
Also in:
lkml
On Tue, Dec 12, 2017 at 05:04:37PM -0800, Jakub Kicinski wrote:
On Wed, 13 Dec 2017 00:36:59 +0000, Al Viro wrote:quoted
On Tue, Dec 12, 2017 at 03:59:33PM -0800, Jakub Kicinski wrote:quoted
quoted
+static __always_inline __##type type##_replace_bits(__##type old, \ + base val, base mask) \ +{ \ + __##type m = to(mask); \ + if (__builtin_constant_p(val) && \Is the lack of a __builtin_constant_p(mask) test intentional? Sometimes the bitfield is a packed array and people may have a helper to which only the mask is passed as non-constant and the value is implied by the helper, thus constant.If the mask in non-constant, we probably shouldn't be using that at all; could you show a real-world example where that would be the case?FIELD_* macros explicitly forbid this, since the code would be... suboptimal with the runtime ffsl. Real life examples are the hackish macro NFP_ETH_SET_BIT_CONFIG() in drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c
Why not simply make nfp_eth_set_bit_config() static inline and be done with that? It's not that large and there are only few callers, so...
I remember there was also some Renesas code.. maybe this: https://patchwork.kernel.org/patch/9881279/ it looks like cpg_z_clk_recalc_rate() and cpg_z2_clk_recalc_rate() only differ in mask.
*shrug* That thing would expand into "reg &= 15" in one case and "reg >>= 8; reg &= 15" in another. Either of which is cheaper than a function call, and definitely cheaper than any kind of dynamic calculation of shift, no matter how implemented.