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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 +/