@@ -55,6 +55,7 @@ struct GCBits
5555 onOutOfMemoryError();
5656 }
5757
58+ pragma (inline,true )
5859 wordtype test (size_t i) const nothrow
5960 in
6061 {
@@ -65,6 +66,7 @@ struct GCBits
6566 return core.bitop.bt (data, i);
6667 }
6768
69+ pragma (inline,true )
6870 int set (size_t i) nothrow
6971 in
7072 {
@@ -75,6 +77,7 @@ struct GCBits
7577 return core.bitop.bts (data, i);
7678 }
7779
80+ pragma (inline,true )
7881 int clear (size_t i) nothrow
7982 in
8083 {
@@ -94,8 +97,36 @@ struct GCBits
9497 size_t lastOff = last & BITS_MASK ;
9598 }
9699
100+ // extract loops to allow inlining the rest
101+ void clearWords (size_t firstWord, size_t lastWord) nothrow
102+ {
103+ for (size_t w = firstWord; w < lastWord; w++ )
104+ data[w] = 0 ;
105+ }
106+
107+ void setWords (size_t firstWord, size_t lastWord) nothrow
108+ {
109+ for (size_t w = firstWord; w < lastWord; w++ )
110+ data[w] = ~ 0 ;
111+ }
112+
113+ void copyWords (size_t firstWord, size_t lastWord, const (wordtype)* source) nothrow
114+ {
115+ for (size_t w = firstWord; w < lastWord; w++ )
116+ data[w] = source[w - firstWord];
117+ }
118+
119+ void copyWordsShifted (size_t firstWord, size_t cntWords, size_t firstOff, const (wordtype)* source) nothrow
120+ {
121+ wordtype mask = ~ BITS_0 << firstOff;
122+ data[firstWord] = (data[firstWord] & ~ mask) | (source[0 ] << firstOff);
123+ for (size_t w = 1 ; w < cntWords; w++ )
124+ data[firstWord + w] = (source[w - 1 ] >> (BITS_PER_WORD - firstOff)) | (source[w] << firstOff);
125+ }
126+
97127 // target = the biti to start the copy to
98128 // destlen = the number of bits to copy from source
129+ pragma (inline,true )
99130 void copyRange (size_t target, size_t len, const (wordtype)* source) nothrow
100131 {
101132 version (bitwise)
@@ -108,36 +139,36 @@ struct GCBits
108139 }
109140 else
110141 {
111- if (len == 0 )
112- return ;
142+ if (len > 0 )
143+ copyRangeZ(target, len, source);
144+ }
145+ }
113146
114- mixin RangeVars! ();
147+ pragma (inline,true )
148+ void copyRangeZ (size_t target, size_t len, const (wordtype)* source) nothrow
149+ {
150+ mixin RangeVars! ();
115151
116- if (firstWord == lastWord)
117- {
118- wordtype mask = ((BITS_2 << (lastOff - firstOff)) - 1 ) << firstOff;
119- data[firstWord] = (data[firstWord] & ~ mask) | ((source[0 ] << firstOff) & mask);
120- }
121- else if (firstOff == 0 )
122- {
123- for (size_t w = firstWord; w < lastWord; w++ )
124- data[w] = source[w - firstWord];
152+ if (firstWord == lastWord)
153+ {
154+ wordtype mask = ((BITS_2 << (lastOff - firstOff)) - 1 ) << firstOff;
155+ data[firstWord] = (data[firstWord] & ~ mask) | ((source[0 ] << firstOff) & mask);
156+ }
157+ else if (firstOff == 0 )
158+ {
159+ copyWords(firstWord, lastWord, source);
125160
126- wordtype mask = (BITS_2 << lastOff) - 1 ;
127- data[lastWord] = (data[lastWord] & ~ mask) | (source[lastWord - firstWord] & mask);
128- }
129- else
130- {
131- size_t cntWords = lastWord - firstWord;
132- wordtype mask = ~ BITS_0 << firstOff;
133- data[firstWord] = (data[firstWord] & ~ mask) | (source[0 ] << firstOff);
134- for (size_t w = 1 ; w < cntWords; w++ )
135- data[firstWord + w] = (source[w - 1 ] >> (BITS_PER_WORD - firstOff)) | (source[w] << firstOff);
136-
137- wordtype src = (source[cntWords - 1 ] >> (BITS_PER_WORD - firstOff)) | (source[cntWords] << firstOff);
138- mask = (BITS_2 << lastOff) - 1 ;
139- data[lastWord] = (data[lastWord] & ~ mask) | (src & mask);
140- }
161+ wordtype mask = (BITS_2 << lastOff) - 1 ;
162+ data[lastWord] = (data[lastWord] & ~ mask) | (source[lastWord - firstWord] & mask);
163+ }
164+ else
165+ {
166+ size_t cntWords = lastWord - firstWord;
167+ copyWordsShifted(firstWord, cntWords, firstOff, source);
168+
169+ wordtype src = (source[cntWords - 1 ] >> (BITS_PER_WORD - firstOff)) | (source[cntWords] << firstOff);
170+ wordtype mask = (BITS_2 << lastOff) - 1 ;
171+ data[lastWord] = (data[lastWord] & ~ mask) | (src & mask);
141172 }
142173 }
143174
@@ -227,6 +258,7 @@ struct GCBits
227258 }
228259 }
229260
261+ pragma (inline,true )
230262 void setRange (size_t target, size_t len) nothrow
231263 {
232264 version (bitwise)
@@ -236,27 +268,31 @@ struct GCBits
236268 }
237269 else
238270 {
239- if (len == 0 )
240- return ;
271+ if (len > 0 )
272+ setRangeZ(target, len);
273+ }
274+ }
241275
242- mixin RangeVars! ();
276+ pragma (inline,true )
277+ void setRangeZ (size_t target, size_t len) nothrow
278+ {
279+ mixin RangeVars! ();
243280
244- if (firstWord == lastWord)
245- {
246- wordtype mask = ((BITS_2 << (lastOff - firstOff)) - 1 ) << firstOff;
247- data[firstWord] |= mask;
248- }
249- else
250- {
251- data[firstWord] |= ~ BITS_0 << firstOff;
252- for (size_t w = firstWord + 1 ; w < lastWord; w++ )
253- data[w] = ~ 0 ;
254- wordtype mask = (BITS_2 << lastOff) - 1 ;
255- data[lastWord] |= mask;
256- }
281+ if (firstWord == lastWord)
282+ {
283+ wordtype mask = ((BITS_2 << (lastOff - firstOff)) - 1 ) << firstOff;
284+ data[firstWord] |= mask;
285+ }
286+ else
287+ {
288+ data[firstWord] |= ~ BITS_0 << firstOff;
289+ setWords(firstWord + 1 , lastWord);
290+ wordtype mask = (BITS_2 << lastOff) - 1 ;
291+ data[lastWord] |= mask;
257292 }
258293 }
259294
295+ pragma (inline,true )
260296 void clrRange (size_t target, size_t len) nothrow
261297 {
262298 version (bitwise)
@@ -266,24 +302,26 @@ struct GCBits
266302 }
267303 else
268304 {
269- if (len == 0 )
270- return ;
271-
272- mixin RangeVars ! ();
305+ if (len > 0 )
306+ clrRangeZ(target, len) ;
307+ }
308+ }
273309
274- if (firstWord == lastWord)
275- {
276- wordtype mask = ((BITS_2 << (lastOff - firstOff)) - 1 ) << firstOff;
277- data[firstWord] &= ~ mask;
278- }
279- else
280- {
281- data[firstWord] &= ~ (~ BITS_0 << firstOff);
282- for (size_t w = firstWord + 1 ; w < lastWord; w++ )
283- data[w] = 0 ;
284- wordtype mask = (BITS_2 << lastOff) - 1 ;
285- data[lastWord] &= ~ mask;
286- }
310+ pragma (inline,true )
311+ void clrRangeZ (size_t target, size_t len) nothrow
312+ {
313+ mixin RangeVars! ();
314+ if (firstWord == lastWord)
315+ {
316+ wordtype mask = ((BITS_2 << (lastOff - firstOff)) - 1 ) << firstOff;
317+ data[firstWord] &= ~ mask;
318+ }
319+ else
320+ {
321+ data[firstWord] &= ~ (~ BITS_0 << firstOff);
322+ clearWords(firstWord + 1 , lastWord);
323+ wordtype mask = (BITS_2 << lastOff) - 1 ;
324+ data[lastWord] &= ~ mask;
287325 }
288326 }
289327
0 commit comments