4 popu_count012( unsigned int u0, unsigned int u1, unsigned int u2 )
7 while ( u0 ) { counter++; u0 &= u0 - 1U; }
8 while ( u1 ) { counter++; u1 &= u1 - 1U; }
9 while ( u2 ) { counter++; u2 &= u2 - 1U; }
17 first_one012( unsigned int u0, unsigned int u1, unsigned int u2 )
21 if ( _BitScanReverse( &index, u0 ) ) { return 26 - index; }
22 if ( _BitScanReverse( &index, u1 ) ) { return 53 - index; }
23 _BitScanReverse( &index, u2 );
28 last_one210( unsigned int u2, unsigned int u1, unsigned int u0 )
32 if ( _BitScanForward( &index, u2 ) ) { return 80 - index; }
33 if ( _BitScanForward( &index, u1 ) ) { return 53 - index; }
34 _BitScanForward( &index, u0 );
39 first_one01( unsigned int u0, unsigned int u1 )
43 if ( _BitScanReverse( &index, u0 ) ) { return 26 - index; }
44 _BitScanReverse( &index, u1 );
49 first_one12( unsigned int u1, unsigned int u2 )
53 if ( _BitScanReverse( &index, u1 ) ) { return 53 - index; }
54 _BitScanReverse( &index, u2 );
59 last_one01( unsigned int u0, unsigned int u1 )
63 if ( _BitScanForward( &index, u1 ) ) { return 53 - index; }
64 _BitScanForward( &index, u0 );
69 last_one12( unsigned int u1, unsigned u2 )
73 if ( _BitScanForward( &index, u2 ) ) { return 80 - index; }
74 _BitScanForward( &index, u1 );
79 first_one1( unsigned int u1 )
83 _BitScanReverse( &index, u1 );
88 first_one2( unsigned int u2 )
92 _BitScanReverse( &index, u2 );
97 last_one0( unsigned int u0 )
101 _BitScanForward( &index, u0 );
106 last_one1( unsigned int u1 )
110 _BitScanForward( &index, u1 );
114 #elif defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
117 first_one012( unsigned int u0, unsigned int u1, unsigned int u2 )
119 if ( u0 ) { return __builtin_clz( u0 ) - 5; }
120 if ( u1 ) { return __builtin_clz( u1 ) + 22; }
121 return __builtin_clz( u2 ) + 49;
126 last_one210( unsigned int u2, unsigned int u1, unsigned int u0 )
128 if ( u2 ) { return 80 - __builtin_ctz( u2 ); }
129 if ( u1 ) { return 53 - __builtin_ctz( u1 ); }
130 return 26 - __builtin_ctz( u0 );
135 first_one01( unsigned int u0, unsigned int u1 )
137 if ( u0 ) { return __builtin_clz( u0 ) - 5; }
138 return __builtin_clz( u1 ) + 22;
143 first_one12( unsigned int u1, unsigned int u2 )
145 if ( u1 ) { return __builtin_clz( u1 ) + 22; }
146 return __builtin_clz( u2 ) + 49;
151 last_one01( unsigned int u0, unsigned int u1 )
153 if ( u1 ) { return 53 - __builtin_ctz( u1 ); }
154 return 26 - __builtin_ctz( u0 );
159 last_one12( unsigned int u1, unsigned int u2 )
161 if ( u2 ) { return 80 - __builtin_ctz( u2 ); }
162 return 53 - __builtin_ctz( u1 );
166 int first_one1( unsigned int u1 ) { return __builtin_clz( u1 ) + 22; }
167 int first_one2( unsigned int u2 ) { return __builtin_clz( u2 ) + 49; }
168 int last_one0( unsigned int u0 ) { return 26 - __builtin_ctz( u0 ); }
169 int last_one1( unsigned int u1 ) { return 53 - __builtin_ctz( u1 ); }
174 first_one012( unsigned int u0, unsigned int u1, unsigned int u2 )
176 if ( u0 & 0x7fc0000 ) { return aifirst_one[u0>>18] + 0; }
177 if ( u0 & 0x7fffe00 ) { return aifirst_one[u0>> 9] + 9; }
178 if ( u0 & 0x7ffffff ) { return aifirst_one[u0 ] + 18; }
180 if ( u1 & 0x7fc0000 ) { return aifirst_one[u1>>18] + 27; }
181 if ( u1 & 0x7fffe00 ) { return aifirst_one[u1>> 9] + 36; }
182 if ( u1 & 0x7ffffff ) { return aifirst_one[u1 ] + 45; }
184 if ( u2 & 0x7fc0000 ) { return aifirst_one[u2>>18] + 54; }
185 if ( u2 & 0x7fffe00 ) { return aifirst_one[u2>> 9] + 63; }
186 return aifirst_one[u2] + 72;
191 last_one210( unsigned int u2, unsigned int u1, unsigned int u0 )
195 j = u2 & 0x00001ff; if ( j ) { return ailast_one[j ] + 72; }
196 j = u2 & 0x003ffff; if ( j ) { return ailast_one[j>> 9] + 63; }
197 if ( u2 & 0x7ffffff ) { return ailast_one[u2>>18] + 54; }
199 j = u1 & 0x00001ff; if ( j ) { return ailast_one[j ] + 45; }
200 j = u1 & 0x003ffff; if ( j ) { return ailast_one[j>> 9] + 36; }
201 if ( u1 & 0x7ffffff ) { return ailast_one[u1>>18] + 27; }
203 j = u0 & 0x00001ff; if ( j ) { return ailast_one[j ] + 18; }
204 j = u0 & 0x003ffff; if ( j ) { return ailast_one[j>> 9] + 9; }
205 return ailast_one[u0>>18];
210 first_one01( unsigned int u0, unsigned int u1 )
212 if ( u0 & 0x7fc0000 ) { return aifirst_one[u0>>18] + 0; }
213 if ( u0 & 0x7fffe00 ) { return aifirst_one[u0>> 9] + 9; }
214 if ( u0 & 0x7ffffff ) { return aifirst_one[u0 ] + 18; }
216 if ( u1 & 0x7fc0000 ) { return aifirst_one[u1>>18] + 27; }
217 if ( u1 & 0x7fffe00 ) { return aifirst_one[u1>> 9] + 36; }
218 return aifirst_one[ u1 ] + 45;
223 first_one12( unsigned int u1, unsigned int u2 )
225 if ( u1 & 0x7fc0000 ) { return aifirst_one[u1>>18] + 27; }
226 if ( u1 & 0x7fffe00 ) { return aifirst_one[u1>> 9] + 36; }
227 if ( u1 & 0x7ffffff ) { return aifirst_one[u1 ] + 45; }
229 if ( u2 & 0x7fc0000 ) { return aifirst_one[u2>>18] + 54; }
230 if ( u2 & 0x7fffe00 ) { return aifirst_one[u2>> 9] + 63; }
231 return aifirst_one[ u2 ] + 72;
236 last_one01( unsigned int u0, unsigned int u1 )
240 j = u1 & 0x00001ff; if ( j ) { return ailast_one[j ] + 45; }
241 j = u1 & 0x003ffff; if ( j ) { return ailast_one[j>> 9] + 36; }
242 if ( u1 & 0x7ffffff ) { return ailast_one[u1>>18] + 27; }
244 j = u0 & 0x00001ff; if ( j ) { return ailast_one[j ] + 18; }
245 j = u0 & 0x003ffff; if ( j ) { return ailast_one[j>> 9] + 9; }
246 return ailast_one[u0>>18];
251 last_one12( unsigned int u1, unsigned int u2 )
255 j = u2 & 0x00001ff; if ( j ) { return ailast_one[j ] + 72; }
256 j = u2 & 0x003ffff; if ( j ) { return ailast_one[j>> 9] + 63; }
257 if ( u2 & 0x7ffffff ) { return ailast_one[u2>>18] + 54; }
259 j = u1 & 0x00001ff; if ( j ) { return ailast_one[j ] + 45; }
260 j = u1 & 0x003ffff; if ( j ) { return ailast_one[j>> 9] + 36; }
261 return ailast_one[u1>>18] + 27;
266 first_one1( unsigned int u1 )
268 if ( u1 & 0x7fc0000U ) { return aifirst_one[u1>>18] + 27; }
269 if ( u1 & 0x7fffe00U ) { return aifirst_one[u1>> 9] + 36; }
270 return aifirst_one[u1] + 45;
275 first_one2( unsigned int u2 )
277 if ( u2 & 0x7fc0000U ) { return aifirst_one[u2>>18] + 54; }
278 if ( u2 & 0x7fffe00U ) { return aifirst_one[u2>> 9] + 63; }
279 return aifirst_one[u2] + 72;
284 last_one0( unsigned int i )
288 j = i & 0x00001ffU; if ( j ) { return ailast_one[j ] + 18; }
289 j = i & 0x003ffffU; if ( j ) { return ailast_one[j>> 9] + 9; }
290 return ailast_one[i>>18];
295 last_one1( unsigned int u1 )
299 j = u1 & 0x00001ffU; if ( j ) { return ailast_one[j ] + 45; }
300 j = u1 & 0x003ffffU; if ( j ) { return ailast_one[j>> 9] + 36; }
301 return ailast_one[u1>>18] + 27;