Mercurial > projects > ldc
annotate runtime/internal/dmdintrinsic.d @ 606:c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Wed, 17 Sep 2008 19:54:37 +0200 |
parents | |
children |
rev | line source |
---|---|
606
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
1 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
2 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
3 // written by Walter Bright |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
4 // www.digitalmars.com |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
5 // Placed into the public domain |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
6 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
7 /* NOTE: This file has been patched from the original DMD distribution to |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
8 work with the GDC compiler. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
9 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
10 Modified by David Friedman, May 2006 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
11 Modified by Christian Kamm, Sep 2008 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
12 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
13 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
14 /** These functions are built-in intrinsics to the compiler. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
15 * |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
16 Intrinsic functions are functions built in to the compiler, |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
17 usually to take advantage of specific CPU features that |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
18 are inefficient to handle via external functions. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
19 The compiler's optimizer and code generator are fully |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
20 integrated in with intrinsic functions, bringing to bear |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
21 their full power on them. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
22 This can result in some surprising speedups. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
23 * Macros: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
24 * WIKI=Phobos/StdIntrinsic |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
25 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
26 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
27 module std.intrinsic; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
28 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
29 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
30 * Scans the bits in v starting with bit 0, looking |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
31 * for the first set bit. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
32 * Returns: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
33 * The bit number of the first bit set. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
34 * The return value is undefined if v is zero. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
35 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
36 int bsf(uint v) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
37 { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
38 uint m = 1; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
39 uint i; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
40 for (i = 0; i < 32; i++,m<<=1) { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
41 if (v&m) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
42 return i; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
43 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
44 return i; // supposed to be undefined |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
45 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
46 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
47 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
48 * Scans the bits in v from the most significant bit |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
49 * to the least significant bit, looking |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
50 * for the first set bit. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
51 * Returns: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
52 * The bit number of the first bit set. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
53 * The return value is undefined if v is zero. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
54 * Example: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
55 * --- |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
56 * import std.intrinsic; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
57 * |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
58 * int main() |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
59 * { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
60 * uint v; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
61 * int x; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
62 * |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
63 * v = 0x21; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
64 * x = bsf(v); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
65 * printf("bsf(x%x) = %d\n", v, x); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
66 * x = bsr(v); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
67 * printf("bsr(x%x) = %d\n", v, x); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
68 * return 0; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
69 * } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
70 * --- |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
71 * Output: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
72 * bsf(x21) = 0<br> |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
73 * bsr(x21) = 5 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
74 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
75 int bsr(uint v) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
76 { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
77 uint m = 0x80000000; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
78 uint i; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
79 for (i = 32; i ; i--,m>>>=1) { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
80 if (v&m) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
81 return i-1; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
82 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
83 return i; // supposed to be undefined |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
84 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
85 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
86 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
87 * Tests the bit. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
88 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
89 int bt(uint *p, uint bitnum) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
90 { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
91 return (p[bitnum / (uint.sizeof*8)] & (1<<(bitnum & ((uint.sizeof*8)-1)))) ? -1 : 0 ; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
92 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
93 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
94 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
95 * Tests and complements the bit. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
96 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
97 int btc(uint *p, uint bitnum) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
98 { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
99 uint * q = p + (bitnum / (uint.sizeof*8)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
100 uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
101 int result = *q & mask; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
102 *q ^= mask; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
103 return result ? -1 : 0; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
104 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
105 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
106 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
107 * Tests and resets (sets to 0) the bit. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
108 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
109 int btr(uint *p, uint bitnum) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
110 { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
111 uint * q = p + (bitnum / (uint.sizeof*8)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
112 uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
113 int result = *q & mask; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
114 *q &= ~mask; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
115 return result ? -1 : 0; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
116 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
117 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
118 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
119 * Tests and sets the bit. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
120 * Params: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
121 * p = a non-NULL pointer to an array of uints. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
122 * index = a bit number, starting with bit 0 of p[0], |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
123 * and progressing. It addresses bits like the expression: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
124 --- |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
125 p[index / (uint.sizeof*8)] & (1 << (index & ((uint.sizeof*8) - 1))) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
126 --- |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
127 * Returns: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
128 * A non-zero value if the bit was set, and a zero |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
129 * if it was clear. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
130 * |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
131 * Example: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
132 * --- |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
133 import std.intrinsic; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
134 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
135 int main() |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
136 { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
137 uint array[2]; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
138 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
139 array[0] = 2; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
140 array[1] = 0x100; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
141 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
142 printf("btc(array, 35) = %d\n", <b>btc</b>(array, 35)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
143 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
144 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
145 printf("btc(array, 35) = %d\n", <b>btc</b>(array, 35)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
146 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
147 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
148 printf("bts(array, 35) = %d\n", <b>bts</b>(array, 35)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
149 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
150 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
151 printf("btr(array, 35) = %d\n", <b>btr</b>(array, 35)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
152 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
153 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
154 printf("bt(array, 1) = %d\n", <b>bt</b>(array, 1)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
155 printf("array = [0]:x%x, [1]:x%x\n", array[0], array[1]); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
156 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
157 return 0; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
158 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
159 * --- |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
160 * Output: |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
161 <pre> |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
162 btc(array, 35) = 0 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
163 array = [0]:x2, [1]:x108 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
164 btc(array, 35) = -1 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
165 array = [0]:x2, [1]:x100 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
166 bts(array, 35) = 0 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
167 array = [0]:x2, [1]:x108 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
168 btr(array, 35) = -1 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
169 array = [0]:x2, [1]:x100 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
170 bt(array, 1) = -1 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
171 array = [0]:x2, [1]:x100 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
172 </pre> |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
173 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
174 int bts(uint *p, uint bitnum) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
175 { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
176 uint * q = p + (bitnum / (uint.sizeof*8)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
177 uint mask = 1 << (bitnum & ((uint.sizeof*8) - 1)); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
178 int result = *q & mask; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
179 *q |= mask; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
180 return result ? -1 : 0; |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
181 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
182 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
183 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
184 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
185 * Swaps bytes in a 4 byte uint end-to-end, i.e. byte 0 becomes |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
186 byte 3, byte 1 becomes byte 2, byte 2 becomes byte 1, byte 3 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
187 becomes byte 0. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
188 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
189 uint bswap(uint v) |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
190 { |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
191 return ((v&0xFF)<<24)|((v&0xFF00)<<8)|((v&0xFF0000)>>>8)|((v&0xFF000000)>>>24); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
192 } |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
193 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
194 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
195 // |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
196 // Unimplemented functions |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
197 // |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
198 /+ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
199 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
200 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
201 * Reads I/O port at port_address. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
202 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
203 ubyte inp(uint port_address); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
204 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
205 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
206 * ditto |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
207 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
208 ushort inpw(uint port_address); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
209 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
210 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
211 * ditto |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
212 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
213 uint inpl(uint port_address); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
214 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
215 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
216 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
217 * Writes and returns value to I/O port at port_address. |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
218 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
219 ubyte outp(uint port_address, ubyte value); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
220 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
221 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
222 * ditto |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
223 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
224 ushort outpw(uint port_address, ushort value); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
225 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
226 /** |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
227 * ditto |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
228 */ |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
229 uint outpl(uint port_address, uint value); |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
230 |
c7fbcb6b923e
Add implementations for dmd intrinsics. Fixes #92.
Christian Kamm <kamm incasoftware de>
parents:
diff
changeset
|
231 +/ |