23static U32 rrClz32(
U32 val);
24static U32 rrClz64(
U64 val);
25static U32 rrCtz32(
U32 val);
26static U32 rrCtz64(
U64 val);
28static U32 rrClzBytes32(
U32 val);
29static U32 rrClzBytes64(
U64 val);
30static U32 rrCtzBytes32(
U32 val);
31static U32 rrCtzBytes64(
U64 val);
42static RADINLINE U32 rrLowestSetBitMask32(
U32 val) {
return val & (0 - val); }
43static RADINLINE U64 rrLowestSetBitMask64(
U64 val) {
return val & (0 - val); }
46static RADINLINE U32 rrMaskThroughToLowestSet32(
U32 val) {
return val ^ (val - 1); }
47static RADINLINE U64 rrMaskThroughToLowestSet64(
U64 val) {
return val ^ (val - 1); }
50static RADINLINE U32 rrClearLowestSetBit32(
U32 val) {
return val & (val - 1); }
51static RADINLINE U64 rrClearLowestSetBit64(
U64 val) {
return val & (val - 1); }
53#if defined(__GNUC__) || defined(__clang__)
62 #define SYNTHESIZE_BYTE_FUNCS
64#elif defined(_MSC_VER)
66 #if defined(__RADARM__) && defined(_WIN32_WCE)
69 #define SYNTHESIZE_ALL
71 #elif defined(__RADARM64__)
80 static RADINLINE U32 rrCtz32(
U32 val) {
return 31 - rrClz32(val & (0u - val)); }
83 #define SYNTHESIZE_BYTE_FUNCS
85 #elif defined(__RADARM__)
90 static RADINLINE U32 rrClz64(
U64 val) {
U32 hi = (
U32) (val >> 32);
return hi ? rrClz32(hi) : 32 + rrClz32((
U32) val); }
94 static RADINLINE U32 rrCtz32(
U32 val) {
return 31 - rrClz32(val & (0u - val)); }
97 #define SYNTHESIZE_BYTE_FUNCS
99 #elif defined(__RADPPC__)
101 #include <PPCIntrinsics.h>
108 static RADINLINE U32 rrCtz32(
U32 val) {
return 31 - rrClz32(val & (0u - val)); }
111 #define SYNTHESIZE_BYTE_FUNCS
113 #elif defined(__RADX64__) && (defined(__RADJAGUAR__) || defined(__AVX2__))
115 #include <immintrin.h>
123 #define SYNTHESIZE_BYTE_FUNCS
125 #elif defined(__RADX64__)
135 #define SYNTHESIZE_BYTE_FUNCS
137 #elif defined(__RADX86__)
142 static RADINLINE U32 rrClz64(
U64 val) {
U32 hi = (
U32) (val >> 32);
return hi ? rrClz32(hi) : 32 + rrClz32((
U32) val); }
145 static RADINLINE U32 rrCtz64(
U64 val) {
U32 lo = (
U32) val;
return lo ? rrCtz32(lo) : 32 + rrCtz32((
U32) (val >> 32)); }
147 #define SYNTHESIZE_BYTE_FUNCS
151 #error Unknown MSVC target
157 #error Implement rrBits for this target
161#ifdef SYNTHESIZE_BYTE_FUNCS
165static RADINLINE U32 rrClzBytes32(
U32 val) {
return rrClz32(val) >> 3; }
166static RADINLINE U32 rrClzBytes64(
U64 val) {
return rrClz64(val) >> 3; }
168static RADINLINE U32 rrCtzBytes32(
U32 val) {
return rrCtz32(val) >> 3; }
169static RADINLINE U32 rrCtzBytes64(
U64 val) {
return rrCtz64(val) >> 3; }
171#undef SYNTHESIZE_BYTE_FUNCS
180 static U8 const lut[16] = { 0,1,2,2, 3,3,3,3, 4,4,4,4, 4,4,4,4 };
183 if (val & 0xffff0000u) { nz -= 16; val >>= 16; }
184 if (val & 0x0000ff00u) { nz -= 8; val >>= 8; }
185 if (val & 0x000000f0u) { nz -= 4; val >>= 4; }
186 return nz -
lut[val & 0xf];
192 static U8 const lut[16] = { 4,0,1,0, 2,0,1,0, 3,0,1,0, 2,0,1,0 };
195 if ((val & 0xffff) == 0) { nz += 16; val >>= 16; }
196 if ((val & 0x00ff) == 0) { nz += 8; val >>= 8; }
197 if ((val & 0x000f) == 0) { nz += 4; val >>= 4; }
198 return nz +
lut[val & 0xf];
201static RADINLINE U32 rrClz64(
U64 val) {
U32 hi = (
U32) (val >> 32);
return hi ? rrClz32(hi) : 32 + rrClz32((
U32) val); }
202static RADINLINE U32 rrCtz64(
U64 val) {
U32 lo = (
U32) val;
return lo ? rrCtz32(lo) : 32 + rrCtz32((
U32) (val >> 32)); }
209 if (val & 0xff000000u)
return 0;
210 if (val & 0x00ff0000u)
return 1;
211 if (val & 0x0000ff00u)
return 2;
218 if (val & 0x000000ffu)
return 0;
219 if (val & 0x0000ff00u)
return 1;
220 if (val & 0x00ff0000u)
return 2;
224static RADINLINE U32 rrClzBytes64(
U64 val) {
U32 hi = (
U32) (val >> 32);
return hi ? rrClzBytes32(hi) : 4 + rrClzBytes32((
U32) val); }
225static RADINLINE U32 rrCtzBytes64(
U64 val) {
U32 lo = (
U32) val;
return lo ? rrCtzBytes32(lo) : 4 + rrCtzBytes32((
U32) (val >> 32)); }
RAD_U32 U32
Definition egttypes.h:501
RAD_U8 U8
Definition egttypes.h:481
RAD_U64 U64
Definition egttypes.h:511
#define RADINLINE
Definition egttypes.h:387
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127