include/SDL_bits.h
author Ryan C. Gordon <icculus@icculus.org>
Fri, 15 Mar 2013 01:09:19 -0400
changeset 7004 18d4df6942c2
parent 6873 f042ae287155
child 7033 3b12bae22f9e
permissions -rw-r--r--
Replace all the "static __inline__" functions with SDL_FORCE_INLINE.
jorgen@6866
     1
/*
jorgen@6866
     2
  Simple DirectMedia Layer
jorgen@6866
     3
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
jorgen@6866
     4
jorgen@6866
     5
  This software is provided 'as-is', without any express or implied
jorgen@6866
     6
  warranty.  In no event will the authors be held liable for any damages
jorgen@6866
     7
  arising from the use of this software.
jorgen@6866
     8
jorgen@6866
     9
  Permission is granted to anyone to use this software for any purpose,
jorgen@6866
    10
  including commercial applications, and to alter it and redistribute it
jorgen@6866
    11
  freely, subject to the following restrictions:
jorgen@6866
    12
jorgen@6866
    13
  1. The origin of this software must not be misrepresented; you must not
jorgen@6866
    14
     claim that you wrote the original software. If you use this software
jorgen@6866
    15
     in a product, an acknowledgment in the product documentation would be
jorgen@6866
    16
     appreciated but is not required.
jorgen@6866
    17
  2. Altered source versions must be plainly marked as such, and must not be
jorgen@6866
    18
     misrepresented as being the original software.
jorgen@6866
    19
  3. This notice may not be removed or altered from any source distribution.
jorgen@6866
    20
*/
jorgen@6866
    21
jorgen@6866
    22
/**
jorgen@6866
    23
 *  \file SDL_bits.h
jorgen@6866
    24
 *
jorgen@6866
    25
 *  Functions for fiddling with bits and bitmasks.
jorgen@6866
    26
 */
jorgen@6866
    27
jorgen@6866
    28
#ifndef _SDL_bits_h
jorgen@6866
    29
#define _SDL_bits_h
jorgen@6866
    30
jorgen@6866
    31
#include "SDL_stdinc.h"
jorgen@6866
    32
jorgen@6866
    33
#include "begin_code.h"
jorgen@6866
    34
/* Set up for C function definitions, even when using C++ */
jorgen@6866
    35
#ifdef __cplusplus
jorgen@6866
    36
/* *INDENT-OFF* */
jorgen@6866
    37
extern "C" {
jorgen@6866
    38
/* *INDENT-ON* */
jorgen@6866
    39
#endif
jorgen@6866
    40
jorgen@6866
    41
/**
jorgen@6866
    42
 *  \file SDL_bits.h
jorgen@6866
    43
 */
jorgen@6866
    44
jorgen@6866
    45
/**
jorgen@6866
    46
 *  Get the index of the most significant bit. Result is undefined when called
jorgen@6866
    47
 *  with 0. This operation can also be stated as "count leading zeroes" and
jorgen@6866
    48
 *  "log base 2".
jorgen@6866
    49
 *
jorgen@6866
    50
 *  \return Index of the most significant bit.
jorgen@6866
    51
 */
icculus@7004
    52
SDL_FORCE_INLINE Sint8
jorgen@6866
    53
SDL_MostSignificantBitIndex32(Uint32 x)
jorgen@6866
    54
{
jorgen@6866
    55
#if defined(__GNUC__)
jorgen@6866
    56
    /* Count Leading Zeroes builtin in GCC.
jorgen@6866
    57
     * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html
jorgen@6866
    58
     */
jorgen@6866
    59
    return 31 - __builtin_clz(x);
jorgen@6866
    60
#else
jorgen@6866
    61
    /* Based off of Bit Twiddling Hacks by Sean Eron Anderson
jorgen@6866
    62
     * <seander@cs.stanford.edu>, released in the public domain.
jorgen@6873
    63
     * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
jorgen@6866
    64
     */
jorgen@6873
    65
    const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
jorgen@6873
    66
    const Uint8  S[] = {1, 2, 4, 8, 16};
jorgen@6873
    67
jorgen@6873
    68
    Uint8 msbIndex = 0;
jorgen@6873
    69
    int i;
jorgen@6873
    70
jorgen@6873
    71
    for (i = 4; i >= 0; i--)
jorgen@6866
    72
    {
jorgen@6873
    73
        if (x & b[i])
jorgen@6873
    74
        {
jorgen@6873
    75
            x >>= S[i];
jorgen@6873
    76
            msbIndex |= S[i];
jorgen@6873
    77
        }
jorgen@6873
    78
    }
jorgen@6866
    79
jorgen@6873
    80
    return msbIndex;
jorgen@6866
    81
#endif
jorgen@6866
    82
}
jorgen@6866
    83
jorgen@6866
    84
/* Ends C function definitions when using C++ */
jorgen@6866
    85
#ifdef __cplusplus
jorgen@6866
    86
/* *INDENT-OFF* */
jorgen@6866
    87
}
jorgen@6866
    88
/* *INDENT-ON* */
jorgen@6866
    89
#endif
jorgen@6866
    90
#include "close_code.h"
jorgen@6866
    91
jorgen@6866
    92
#endif /* _SDL_bits_h */
jorgen@6866
    93
jorgen@6866
    94
/* vi: set ts=4 sw=4 expandtab: */