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