Search Linux Wireless

ffs() compile-time

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

In rt2x00 I define all registers through the FIELD32(__mask) defines,
which look like this:

struct rt2x00_field32 {
	u32 bit_offset;
	u32 bit_mask;
};

#define FIELD32(__mask)
({
	BUILD_BUG_ON(!(__mask) ||
		     !is_valid_mask(__mask) ||	
		     (__mask) != (u32)(__mask));
	(struct rt2x00_field32) {
		__ffs(__mask), (__mask)
	};
})

As you see everywhere where a define which contains FIELD32() will
make a call to __ffs(). However this is suboptimal since the __mask which
is passed to __ffs() is a constant during compile time.
So it would be very nice when I can make use of a compile-time version of __ffs()
to make GCC find the first bit during compile-time this would increase performance
and help reduce the module size of each rt2x00 driver.

However I am a bit lost at what a proper solution would be, GCC provides
__builtin_ffs() but would that perform the compile-time calculation or not.
Another solution would be creating a macro like:

#define _COMPILE_FFS4(x)\
({			\
	(x) & 0x1 ? 1 :	\
	(x) & 0x2 ? 2 :	\
	(x) & 0x4 ? 3 :	\
	(x) & 0x8 ? 4 :	\
	0;		\
})

And have _COMPILE_FFS8, _COMPILE_FFS16 and _COMPILE_FFS32 use above macro.
But I am kind of hesitant about that macro as well, because it just doesn't feel right. :S

Any advice is welcome. :)
Thanks,

Ivo
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux