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