54 lines
730 B
C
54 lines
730 B
C
![]() |
|
||
|
#ifndef _SDL_bits_h
|
||
|
#define _SDL_bits_h
|
||
|
|
||
|
#include "SDL_stdinc.h"
|
||
|
|
||
|
#include "begin_code.h"
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
SDL_FORCE_INLINE int
|
||
|
SDL_MostSignificantBitIndex32(Uint32 x)
|
||
|
{
|
||
|
#if defined(__GNUC__) && __GNUC__ >= 4
|
||
|
|
||
|
if (x == 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
return 31 - __builtin_clz(x);
|
||
|
#else
|
||
|
|
||
|
const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
|
||
|
const int S[] = {1, 2, 4, 8, 16};
|
||
|
|
||
|
int msbIndex = 0;
|
||
|
int i;
|
||
|
|
||
|
if (x == 0) {
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
for (i = 4; i >= 0; i--)
|
||
|
{
|
||
|
if (x & b[i])
|
||
|
{
|
||
|
x >>= S[i];
|
||
|
msbIndex |= S[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return msbIndex;
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
#include "close_code.h"
|
||
|
|
||
|
#endif
|
||
|
|