include/SDL_bits.h
author Sam Lantinga <slouken@libsdl.org>
Thu, 07 Mar 2013 20:42:55 -0800
changeset 6978 e851407e9294
parent 6873 f042ae287155
child 7004 18d4df6942c2
permissions -rw-r--r--
Put the real SDL_AtomicCAS() and SDL_AtomicCASPtr() symbols into the library.
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
 *  Uses inline functions for compilers that support them, and static
jorgen@6866
    45
 *  functions for those that do not.  Because these functions become
jorgen@6866
    46
 *  static for compilers that do not support inline functions, this
jorgen@6866
    47
 *  header should only be included in files that actually use them.
jorgen@6866
    48
 */
jorgen@6866
    49
jorgen@6866
    50
/**
jorgen@6866
    51
 *  Get the index of the most significant bit. Result is undefined when called
jorgen@6866
    52
 *  with 0. This operation can also be stated as "count leading zeroes" and
jorgen@6866
    53
 *  "log base 2".
jorgen@6866
    54
 *
jorgen@6866
    55
 *  \return Index of the most significant bit.
jorgen@6866
    56
 */
jorgen@6866
    57
static __inline__ Sint8
jorgen@6866
    58
SDL_MostSignificantBitIndex32(Uint32 x)
jorgen@6866
    59
{
jorgen@6866
    60
#if defined(__GNUC__)
jorgen@6866
    61
    /* Count Leading Zeroes builtin in GCC.
jorgen@6866
    62
     * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html
jorgen@6866
    63
     */
jorgen@6866
    64
    return 31 - __builtin_clz(x);
jorgen@6866
    65
#else
jorgen@6866
    66
    /* Based off of Bit Twiddling Hacks by Sean Eron Anderson
jorgen@6866
    67
     * <seander@cs.stanford.edu>, released in the public domain.
jorgen@6873
    68
     * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
jorgen@6866
    69
     */
jorgen@6873
    70
    const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
jorgen@6873
    71
    const Uint8  S[] = {1, 2, 4, 8, 16};
jorgen@6873
    72
jorgen@6873
    73
    Uint8 msbIndex = 0;
jorgen@6873
    74
    int i;
jorgen@6873
    75
jorgen@6873
    76
    for (i = 4; i >= 0; i--)
jorgen@6866
    77
    {
jorgen@6873
    78
        if (x & b[i])
jorgen@6873
    79
        {
jorgen@6873
    80
            x >>= S[i];
jorgen@6873
    81
            msbIndex |= S[i];
jorgen@6873
    82
        }
jorgen@6873
    83
    }
jorgen@6866
    84
jorgen@6873
    85
    return msbIndex;
jorgen@6866
    86
#endif
jorgen@6866
    87
}
jorgen@6866
    88
jorgen@6866
    89
/* Ends C function definitions when using C++ */
jorgen@6866
    90
#ifdef __cplusplus
jorgen@6866
    91
/* *INDENT-OFF* */
jorgen@6866
    92
}
jorgen@6866
    93
/* *INDENT-ON* */
jorgen@6866
    94
#endif
jorgen@6866
    95
#include "close_code.h"
jorgen@6866
    96
jorgen@6866
    97
#endif /* _SDL_bits_h */
jorgen@6866
    98
jorgen@6866
    99
/* vi: set ts=4 sw=4 expandtab: */