1*a09e64fbSRussell King /* 2*a09e64fbSRussell King * FILE bitfield.h 3*a09e64fbSRussell King * 4*a09e64fbSRussell King * Version 1.1 5*a09e64fbSRussell King * Author Copyright (c) Marc A. Viredaz, 1998 6*a09e64fbSRussell King * DEC Western Research Laboratory, Palo Alto, CA 7*a09e64fbSRussell King * Date April 1998 (April 1997) 8*a09e64fbSRussell King * System Advanced RISC Machine (ARM) 9*a09e64fbSRussell King * Language C or ARM Assembly 10*a09e64fbSRussell King * Purpose Definition of macros to operate on bit fields. 11*a09e64fbSRussell King */ 12*a09e64fbSRussell King 13*a09e64fbSRussell King 14*a09e64fbSRussell King 15*a09e64fbSRussell King #ifndef __BITFIELD_H 16*a09e64fbSRussell King #define __BITFIELD_H 17*a09e64fbSRussell King 18*a09e64fbSRussell King #ifndef __ASSEMBLY__ 19*a09e64fbSRussell King #define UData(Data) ((unsigned long) (Data)) 20*a09e64fbSRussell King #else 21*a09e64fbSRussell King #define UData(Data) (Data) 22*a09e64fbSRussell King #endif 23*a09e64fbSRussell King 24*a09e64fbSRussell King 25*a09e64fbSRussell King /* 26*a09e64fbSRussell King * MACRO: Fld 27*a09e64fbSRussell King * 28*a09e64fbSRussell King * Purpose 29*a09e64fbSRussell King * The macro "Fld" encodes a bit field, given its size and its shift value 30*a09e64fbSRussell King * with respect to bit 0. 31*a09e64fbSRussell King * 32*a09e64fbSRussell King * Note 33*a09e64fbSRussell King * A more intuitive way to encode bit fields would have been to use their 34*a09e64fbSRussell King * mask. However, extracting size and shift value information from a bit 35*a09e64fbSRussell King * field's mask is cumbersome and might break the assembler (255-character 36*a09e64fbSRussell King * line-size limit). 37*a09e64fbSRussell King * 38*a09e64fbSRussell King * Input 39*a09e64fbSRussell King * Size Size of the bit field, in number of bits. 40*a09e64fbSRussell King * Shft Shift value of the bit field with respect to bit 0. 41*a09e64fbSRussell King * 42*a09e64fbSRussell King * Output 43*a09e64fbSRussell King * Fld Encoded bit field. 44*a09e64fbSRussell King */ 45*a09e64fbSRussell King 46*a09e64fbSRussell King #define Fld(Size, Shft) (((Size) << 16) + (Shft)) 47*a09e64fbSRussell King 48*a09e64fbSRussell King 49*a09e64fbSRussell King /* 50*a09e64fbSRussell King * MACROS: FSize, FShft, FMsk, FAlnMsk, F1stBit 51*a09e64fbSRussell King * 52*a09e64fbSRussell King * Purpose 53*a09e64fbSRussell King * The macros "FSize", "FShft", "FMsk", "FAlnMsk", and "F1stBit" return 54*a09e64fbSRussell King * the size, shift value, mask, aligned mask, and first bit of a 55*a09e64fbSRussell King * bit field. 56*a09e64fbSRussell King * 57*a09e64fbSRussell King * Input 58*a09e64fbSRussell King * Field Encoded bit field (using the macro "Fld"). 59*a09e64fbSRussell King * 60*a09e64fbSRussell King * Output 61*a09e64fbSRussell King * FSize Size of the bit field, in number of bits. 62*a09e64fbSRussell King * FShft Shift value of the bit field with respect to bit 0. 63*a09e64fbSRussell King * FMsk Mask for the bit field. 64*a09e64fbSRussell King * FAlnMsk Mask for the bit field, aligned on bit 0. 65*a09e64fbSRussell King * F1stBit First bit of the bit field. 66*a09e64fbSRussell King */ 67*a09e64fbSRussell King 68*a09e64fbSRussell King #define FSize(Field) ((Field) >> 16) 69*a09e64fbSRussell King #define FShft(Field) ((Field) & 0x0000FFFF) 70*a09e64fbSRussell King #define FMsk(Field) (((UData (1) << FSize (Field)) - 1) << FShft (Field)) 71*a09e64fbSRussell King #define FAlnMsk(Field) ((UData (1) << FSize (Field)) - 1) 72*a09e64fbSRussell King #define F1stBit(Field) (UData (1) << FShft (Field)) 73*a09e64fbSRussell King 74*a09e64fbSRussell King 75*a09e64fbSRussell King /* 76*a09e64fbSRussell King * MACRO: FInsrt 77*a09e64fbSRussell King * 78*a09e64fbSRussell King * Purpose 79*a09e64fbSRussell King * The macro "FInsrt" inserts a value into a bit field by shifting the 80*a09e64fbSRussell King * former appropriately. 81*a09e64fbSRussell King * 82*a09e64fbSRussell King * Input 83*a09e64fbSRussell King * Value Bit-field value. 84*a09e64fbSRussell King * Field Encoded bit field (using the macro "Fld"). 85*a09e64fbSRussell King * 86*a09e64fbSRussell King * Output 87*a09e64fbSRussell King * FInsrt Bit-field value positioned appropriately. 88*a09e64fbSRussell King */ 89*a09e64fbSRussell King 90*a09e64fbSRussell King #define FInsrt(Value, Field) \ 91*a09e64fbSRussell King (UData (Value) << FShft (Field)) 92*a09e64fbSRussell King 93*a09e64fbSRussell King 94*a09e64fbSRussell King /* 95*a09e64fbSRussell King * MACRO: FExtr 96*a09e64fbSRussell King * 97*a09e64fbSRussell King * Purpose 98*a09e64fbSRussell King * The macro "FExtr" extracts the value of a bit field by masking and 99*a09e64fbSRussell King * shifting it appropriately. 100*a09e64fbSRussell King * 101*a09e64fbSRussell King * Input 102*a09e64fbSRussell King * Data Data containing the bit-field to be extracted. 103*a09e64fbSRussell King * Field Encoded bit field (using the macro "Fld"). 104*a09e64fbSRussell King * 105*a09e64fbSRussell King * Output 106*a09e64fbSRussell King * FExtr Bit-field value. 107*a09e64fbSRussell King */ 108*a09e64fbSRussell King 109*a09e64fbSRussell King #define FExtr(Data, Field) \ 110*a09e64fbSRussell King ((UData (Data) >> FShft (Field)) & FAlnMsk (Field)) 111*a09e64fbSRussell King 112*a09e64fbSRussell King 113*a09e64fbSRussell King #endif /* __BITFIELD_H */ 114