On Sat, May 19, 2012 at 10:57 AM, Peter Maydell <peter.mayd...@linaro.org> wrote: > On 19 May 2012 11:02, Blue Swirl <blauwir...@gmail.com> wrote: >>> +static inline uint32_t field(uint32_t val, int start, int length) >>> +{ >>> + val >>= start; >>> + val &= ~(~0 << length); >>> + return val; >>> +} >> >> Nice function, maybe I could use it in Sparc as well if generalized (later). > > We should totally have something like this in our generic bitops > header file. I've previously worked on a codebase that used something > similar consistently, and it's much easier to read than code which > does inline mask-and-shift code.
Yes. A generic method to construct bit field #defines/enums with nice printout would be nice too. I think I saw something like that in BSD land, can't remember where. > > We probably want a 64 bit variant (or maybe we can just work > on uint64_t and trust the compiler to throw away the top halves > in the 32 bit case?) For Sparc the it would be used to extract fields from an instruction, they are always 32 bits. But IA64 would need a 64 bit version. I'd make two variants, maybe also target_ulong version if ever needed. > > -- PMM