From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 56FBF43B8F; Mon, 4 Mar 2024 17:42:26 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F088540695; Mon, 4 Mar 2024 17:42:25 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id E9A644027D for ; Mon, 4 Mar 2024 17:42:24 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1086) id 344EA20B74C0; Mon, 4 Mar 2024 08:42:24 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 344EA20B74C0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com; s=default; t=1709570544; bh=jH+tBP+laytOlqW1QcAVeqQ0huEWd3FFbcgoqnnuqy0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=LidEM3NEGbPEswUyZED+yKenLbnlY5XvTBLRqSQ1OeAmiDYMSd5ll6bY8BkOie2px B93uE/X+EYGK+UeKrY/Yd63/H7SELxi6Ge7OS5K2zMHueheLxNV6cQz5Y6Y1wZPYlv ITIa69MmdVE9YNAnfvQMZXmRKeTq2LK502KZNTtY= Date: Mon, 4 Mar 2024 08:42:24 -0800 From: Tyler Retzlaff To: Mattias =?iso-8859-1?Q?R=F6nnblom?= Cc: dev@dpdk.org, hofors@lysator.liu.se, Heng Wang Subject: Re: [RFC 2/7] eal: add generic bit manipulation macros Message-ID: <20240304164224.GB16065@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> References: <20240302135328.531940-1-mattias.ronnblom@ericsson.com> <20240302135328.531940-3-mattias.ronnblom@ericsson.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20240302135328.531940-3-mattias.ronnblom@ericsson.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On Sat, Mar 02, 2024 at 02:53:23PM +0100, Mattias Rönnblom wrote: > Add bit-level test/set/clear/assign macros operating on both 32-bit > and 64-bit words by means of C11 generic selection. > > Signed-off-by: Mattias Rönnblom > --- _Generic is nice here. should we discourage direct use of the inline functions in preference of using the macro always? either way lgtm. Acked-by: Tyler Retzlaff > lib/eal/include/rte_bitops.h | 81 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 81 insertions(+) > > diff --git a/lib/eal/include/rte_bitops.h b/lib/eal/include/rte_bitops.h > index 9a368724d5..afd0f11033 100644 > --- a/lib/eal/include/rte_bitops.h > +++ b/lib/eal/include/rte_bitops.h > @@ -107,6 +107,87 @@ extern "C" { > #define RTE_FIELD_GET64(mask, reg) \ > ((typeof(mask))(((reg) & (mask)) >> rte_ctz64(mask))) > > +/** > + * Test bit in word. > + * > + * Generic selection macro to test the value of a bit in a 32-bit or > + * 64-bit word. The type of operation depends on the type of the @c > + * addr parameter. > + * > + * This macro does not give any guarantees in regards to memory > + * ordering or atomicity. > + * > + * @param addr > + * A pointer to the word to modify. > + * @param nr > + * The index of the bit. > + */ > +#define rte_bit_test(addr, nr) \ > + _Generic((addr), \ > + uint32_t *: rte_bit_test32, \ > + uint64_t *: rte_bit_test64)(addr, nr) > + > +/** > + * Set bit in word. > + * > + * Generic selection macro to set a bit in a 32-bit or 64-bit > + * word. The type of operation depends on the type of the @c addr > + * parameter. > + * > + * This macro does not give any guarantees in regards to memory > + * ordering or atomicity. > + * > + * @param addr > + * A pointer to the word to modify. > + * @param nr > + * The index of the bit. > + */ > +#define rte_bit_set(addr, nr) \ > + _Generic((addr), \ > + uint32_t *: rte_bit_set32, \ > + uint64_t *: rte_bit_set64)(addr, nr) > + > +/** > + * Clear bit in word. > + * > + * Generic selection macro to clear a bit in a 32-bit or 64-bit > + * word. The type of operation depends on the type of the @c addr > + * parameter. > + * > + * This macro does not give any guarantees in regards to memory > + * ordering or atomicity. > + * > + * @param addr > + * A pointer to the word to modify. > + * @param nr > + * The index of the bit. > + */ > +#define rte_bit_clear(addr, nr) \ > + _Generic((addr), \ > + uint32_t *: rte_bit_clear32, \ > + uint64_t *: rte_bit_clear64)(addr, nr) > + > +/** > + * Assign a value to a bit in word. > + * > + * Generic selection macro to assign a value to a bit in a 32-bit or 64-bit > + * word. The type of operation depends on the type of the @c addr parameter. > + * > + * This macro does not give any guarantees in regards to memory > + * ordering or atomicity. > + * > + * @param addr > + * A pointer to the word to modify. > + * @param nr > + * The index of the bit. > + * @param value > + * The new value of the bit - true for '1', or false for '0'. > + */ > +#define rte_bit_assign(addr, nr, value) \ > + _Generic((addr), \ > + uint32_t *: rte_bit_assign32, \ > + uint64_t *: rte_bit_assign64)(addr, nr, value) > + > /** > * Test if a particular bit in a 32-bit word is set. > * > -- > 2.34.1