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