Thread (37 messages) 37 messages, 8 authors, 2026-04-27

Re: [PATCH 1/9] bitfield: add FIELD_GET_SIGNED()

From: Andy Shevchenko <hidden>
Date: 2026-04-17 18:12:43
Also in: linux-iio, linux-rtc, linux-wireless, lkml

On Fri, Apr 17, 2026 at 01:36:12PM -0400, Yury Norov wrote:
The bitfields are designed in assumption that fields contain unsigned
integer values, thus extracting the values from the field implies
zero-extending.

Some drivers need to sign-extend their fields, and currently do it like:

	dc_re += sign_extend32(FIELD_GET(0xfff000, tmp), 11);
	dc_im += sign_extend32(FIELD_GET(0xfff, tmp), 11);

It's error-prone because it relies on user to provide the correct
index of the most significant bit and proper 32 vs 64 function flavor.

Thus, introduce a FIELD_GET_SIGNED() macro, which is the more
convenient and compiles (on x86_64) to just a couple instructions:
shl and sar.
...
+#define FIELD_GET_SIGNED(mask, reg)					\
+	({								\
+		__BF_FIELD_CHECK(mask, reg, 0U, "FIELD_GET_SIGNED: ");	\
+		 ((__signed_scalar_typeof(mask))((long long)(reg) <<	\
+		 __builtin_clzll(mask) >> (__builtin_clzll(mask) +	\
+						__builtin_ctzll(mask))));\
I would re-indent these lines as
		 ((__signed_scalar_typeof(mask))
		  ((long long)(reg) << __builtin_clzll(mask) >>		\
		   (__builtin_clzll(mask) + __builtin_ctzll(mask))));	\
+	})
-- 
With Best Regards,
Andy Shevchenko

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help