comparison tango/std/intrinsic.di @ 132:1700239cab2e trunk

[svn r136] MAJOR UNSTABLE UPDATE!!! Initial commit after moving to Tango instead of Phobos. Lots of bugfixes... This build is not suitable for most things.
author lindquist
date Fri, 11 Jan 2008 17:57:40 +0100
parents
children f5ca6bbbf1d7
comparison
equal deleted inserted replaced
131:5825d48b27d1 132:1700239cab2e
1 /**
2 * These functions are built-in intrinsics to the compiler.
3 *
4 * Intrinsic functions are functions built in to the compiler, usually to take
5 * advantage of specific CPU features that are inefficient to handle via
6 * external functions. The compiler's optimizer and code generator are fully
7 * integrated in with intrinsic functions, bringing to bear their full power on
8 * them. This can result in some surprising speedups.
9 *
10 * Copyright: Public Domain
11 * License: Public Domain
12 * Authors: Walter Bright
13 */
14 module std.intrinsic;
15
16
17 /**
18 * Scans the bits in v starting with bit 0, looking
19 * for the first set bit.
20 * Returns:
21 * The bit number of the first bit set.
22 * The return value is undefined if v is zero.
23 */
24 int bsf( uint v );
25
26
27 /**
28 * Scans the bits in v from the most significant bit
29 * to the least significant bit, looking
30 * for the first set bit.
31 * Returns:
32 * The bit number of the first bit set.
33 * The return value is undefined if v is zero.
34 * Example:
35 * ---
36 * import std.intrinsic;
37 *
38 * int main()
39 * {
40 * uint v;
41 * int x;
42 *
43 * v = 0x21;
44 * x = bsf(v);
45 * printf("bsf(x%x) = %d\n", v, x);
46 * x = bsr(v);
47 * printf("bsr(x%x) = %d\n", v, x);
48 * return 0;
49 * }
50 * ---
51 * Output:
52 * bsf(x21) = 0<br>
53 * bsr(x21) = 5
54 */
55 int bsr( uint v );
56
57
58 /**
59 * Tests the bit.
60 */
61 int bt( uint* p, uint bitnum );
62
63
64 /**
65 * Tests and complements the bit.
66 */
67 int btc( uint* p, uint bitnum );
68
69
70 /**
71 * Tests and resets (sets to 0) the bit.
72 */
73 int btr( uint* p, uint bitnum );
74
75
76 /**
77 * Tests and sets the bit.
78 * Params:
79 * p = a non-NULL pointer to an array of uints.
80 * index = a bit number, starting with bit 0 of p[0],
81 * and progressing. It addresses bits like the expression:
82 ---
83 p[index / (uint.sizeof*8)] & (1 << (index & ((uint.sizeof*8) - 1)))
84 ---
85 * Returns:
86 * A non-zero value if the bit was set, and a zero
87 * if it was clear.
88 *
89 * Example:
90 * ---
91 import std.intrinsic;
92
93 int main()
94 {
95 uint array[2];
96
97 array[0] = 2;
98 array[1] = 0x100;
99
100 printf("btc(array, 35) = %d\n", <b>btc</b>(array, 35));
101 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);
102
103 printf("btc(array, 35) = %d\n", <b>btc</b>(array, 35));
104 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);
105
106 printf("bts(array, 35) = %d\n", <b>bts</b>(array, 35));
107 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);
108
109 printf("btr(array, 35) = %d\n", <b>btr</b>(array, 35));
110 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);
111
112 printf("bt(array, 1) = %d\n", <b>bt</b>(array, 1));
113 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]);
114
115 return 0;
116 }
117 * ---
118 * Output:
119 <pre>
120 btc(array, 35) = 0
121 array = [0]:x2, [1]:x108
122 btc(array, 35) = -1
123 array = [0]:x2, [1]:x100
124 bts(array, 35) = 0
125 array = [0]:x2, [1]:x108
126 btr(array, 35) = -1
127 array = [0]:x2, [1]:x100
128 bt(array, 1) = -1
129 array = [0]:x2, [1]:x100
130 </pre>
131 */
132 int bts( uint* p, uint bitnum );
133
134
135 /**
136 * Swaps bytes in a 4 byte uint end-to-end, i.e. byte 0 becomes
137 * byte 3, byte 1 becomes byte 2, byte 2 becomes byte 1, byte 3
138 * becomes byte 0.
139 */
140 uint bswap( uint v );
141
142
143 /**
144 * Reads I/O port at port_address.
145 */
146 ubyte inp( uint port_address );
147
148
149 /**
150 * ditto
151 */
152 ushort inpw( uint port_address );
153
154
155 /**
156 * ditto
157 */
158 uint inpl( uint port_address );
159
160
161 /**
162 * Writes and returns value to I/O port at port_address.
163 */
164 ubyte outp( uint port_address, ubyte value );
165
166
167 /**
168 * ditto
169 */
170 ushort outpw( uint port_address, ushort value );
171
172
173 /**
174 * ditto
175 */
176 uint outpl( uint port_address, uint value );