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