28 static inline FXuchar reverse8(FXuchar x){
29 x=((x<<1)&0xAA) | ((x>>1)&0x55);
30 x=((x<<2)&0xCC) | ((x>>2)&0x33);
31 return (x<<4) | (x>>4);
36 static inline FXushort reverse16(FXushort x){
37 x=((x<<1)&0xAAAA) | ((x>>1)&0x5555);
38 x=((x<<2)&0xCCCC) | ((x>>2)&0x3333);
39 x=((x<<4)&0xF0F0) | ((x>>4)&0x0F0F);
40 return (x<<8) | (x>>8);
45 static inline FXuint reverse32(FXuint x){
46 x=((x<<1)&0xAAAAAAAA) | ((x>>1)&0x55555555);
47 x=((x<<2)&0xCCCCCCCC) | ((x>>2)&0x33333333);
48 x=((x<<4)&0xF0F0F0F0) | ((x>>4)&0x0F0F0F0F);
49 x=((x<<8)&0xFF00FF00) | ((x>>8)&0x00FF00FF);
50 return (x<<16) | (x>>16);
55 static inline FXulong reverse64(FXulong x){
56 x=((x<< 1)&FXULONG(0xAAAAAAAAAAAAAAAA)) | ((x>> 1)&FXULONG(0x5555555555555555));
57 x=((x<< 2)&FXULONG(0xCCCCCCCCCCCCCCCC)) | ((x>> 2)&FXULONG(0x3333333333333333));
58 x=((x<< 4)&FXULONG(0xF0F0F0F0F0F0F0F0)) | ((x>> 4)&FXULONG(0x0F0F0F0F0F0F0F0F));
59 x=((x<< 8)&FXULONG(0xFF00FF00FF00FF00)) | ((x>> 8)&FXULONG(0x00FF00FF00FF00FF));
60 x=((x<<16)&FXULONG(0xFFFF0000FFFF0000)) | ((x>>16)&FXULONG(0x0000FFFF0000FFFF));
61 return (x<<32) | (x>>32);
66 static inline FXushort swap16(FXushort x){
67 #if ((__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) 68 return __builtin_bswap16(x);
69 #elif (_MSC_VER >= 1500) 70 return _byteswap_ushort(x);
72 return (x>>8) | (x<<8);
78 static inline FXuint swap32(FXuint x){
79 #if ((__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) 80 return __builtin_bswap32(x);
81 #elif (_MSC_VER >= 1500) 82 return _byteswap_ulong(x);
84 x=((x<<8)&0xFF00FF00)|((x>>8)&0x00FF00FF);
85 return (x>>16)|(x<<16);
91 static inline FXulong swap64(FXulong x){
92 #if ((__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) 93 return __builtin_bswap64(x);
94 #elif (_MSC_VER >= 1500) 95 return _byteswap_uint64(x);
97 x=((x<< 8)&FXULONG(0xFF00FF00FF00FF00))|((x>> 8)&FXULONG(0x00FF00FF00FF00FF));
98 x=((x<<16)&FXULONG(0xFFFF0000FFFF0000))|((x>>16)&FXULONG(0x0000FFFF0000FFFF));
99 return (x>>32)|(x<<32);
105 static inline FXuint lsb32(FXuint x){
106 return FXuint(x&(-FXint(x)));
111 static inline FXulong lsb64(FXulong x){
112 return FXulong(x&(-FXlong(x)));
117 static inline FXuint msb32(FXuint x){
128 static inline FXulong msb64(FXulong x){
140 static inline FXuint pop32(FXuint x){
141 #if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))) 142 return __builtin_popcount(x);
143 #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) 146 x=x-((x>>1)&0x55555555);
147 x=(x&0x33333333)+((x>>2)&0x33333333);
148 return (((x+(x>>4))&0x0F0F0F0F)*0x01010101)>>24;
154 static inline FXulong pop64(FXulong x){
155 #if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))) 156 #if defined(__LP64__) || defined(_LP64) || (__WORDSIZE == 64) 157 return __builtin_popcountl(x);
159 return __builtin_popcountll(x);
161 #elif defined(_MSC_VER) && (defined(_M_X64)) 162 return __popcnt64(x);
164 x=x-((x>>1)&FXULONG(0x5555555555555555));
165 x=(x&FXULONG(0x3333333333333333))+((x>>2)&FXULONG(0x3333333333333333));
166 return (((x+(x>>4))&FXULONG(0xf0f0f0f0f0f0f0f))*FXULONG(0x101010101010101))>>56;
172 static inline FXuint clz32(FXuint x){
173 #if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))) 174 return __builtin_clz(x);
175 #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) 176 unsigned long result;
177 _BitScanReverse(&result,x);
181 f=(((FXint)(x-0x00010000))>>31)&16; x<<=f;
182 e=(((FXint)(x-0x01000000))>>31)&8; x<<=e;
183 d=(((FXint)(x-0x10000000))>>31)&4; x<<=d;
184 c=(((FXint)(x-0x40000000))>>31)&2; x<<=c;
185 b=(((FXint)(x-0x80000000))>>31)&1;
192 static inline FXulong clz64(FXulong x){
193 #if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))) 194 #if defined(__LP64__) || defined(_LP64) || (__WORDSIZE == 64) 195 return __builtin_clzl(x);
197 return __builtin_clzll(x);
199 #elif defined(_MSC_VER) && defined(_M_X64) 200 unsigned long result;
201 _BitScanReverse64(&result,x);
205 g=(((FXlong)(x-FXULONG(0x0000000100000000)))>>63)&32; x<<=g;
206 f=(((FXlong)(x-FXULONG(0x0001000000000000)))>>63)&16; x<<=f;
207 e=(((FXlong)(x-FXULONG(0x0100000000000000)))>>63)&8; x<<=e;
208 d=(((FXlong)(x-FXULONG(0x1000000000000000)))>>63)&4; x<<=d;
209 c=(((FXlong)(x-FXULONG(0x4000000000000000)))>>63)&2; x<<=c;
210 b=(((FXlong)(x-FXULONG(0x8000000000000000)))>>63)&1;
217 static inline FXuint ctz32(FXuint x){
218 #if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))) 219 return __builtin_ctz(x);
220 #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) 221 unsigned long result;
222 _BitScanForward(&result,x);
225 return 31-clz32(x&-x);
231 static inline FXulong ctz64(FXulong x){
232 #if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))) 233 #if defined(__LP64__) || defined(_LP64) || (__WORDSIZE == 64) 234 return __builtin_ctzl(x);
236 return __builtin_ctzll(x);
238 #elif defined(_MSC_VER) && defined(_M_X64) 239 unsigned long result;
240 _BitScanForward64(&result,x);
243 return FXULONG(63)-clz64(x&-x);
249 static inline FXuint rol32(FXuint value,FXuint count){
250 return (value<<count) | (value>>(32-count));
254 static inline FXuint ror32(FXuint value,FXuint count){
255 return (value>>count) | (value<<(32-count));
260 static inline FXulong rol64(FXulong value,FXulong count){
261 return (value<<count) | (value>>(FXULONG(64)-count));
265 static inline FXulong ror64(FXulong value,FXulong count){
266 return (value>>count) | (value<<(FXULONG(64)-count));
271 static inline FXuint shl32(FXuint value,FXuint count){
272 return (value<<count);
276 static inline FXuint shr32(FXuint value,FXuint count){
277 return (value>>count);
282 static inline FXulong shl64(FXulong value,FXulong count){
283 return (value<<count);
287 static inline FXulong shr64(FXulong value,FXulong count){
288 return (value>>count);
Definition: FX4Splitter.h:28