vmkdrivers/BLD/build/HEADERS/vmkapi-current/vmkernel64/release/base/vmkapi_bits.h
2015-10-23 15:21:55 -04:00

204 lines
5.5 KiB
C

/***************************************************************************
* Copyright 2007 - 2009 VMware, Inc. All rights reserved.
***************************************************************************/
/*
* @VMKAPIMOD_LICENSE@
*/
/*
***********************************************************************
* Bits */ /**
* \defgroup Bits Bit Manipulation
*
* Utility interfaces for bit shifting, flipping, etc.
*
* @{
***********************************************************************
*/
#ifndef _VMKAPI_BITS_H_
#define _VMKAPI_BITS_H_
/** \cond never */
#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H
#error This vmkapi file should never be included directly but only via vmkapi.h
#endif
/** \endcond never */
#include "base/vmkapi_const.h"
#include "base/vmkapi_types.h"
/*
***********************************************************************
* vmk_CPUToBE64 -- */ /**
*
* \ingroup Bits
* \brief Convert an unsigned 64 bit unsigned integer in the
* CPU native endian format into a big endian 64 bit
* unsigned integer.
*
* \param[in] x Value to swap
*
* \return Swapped value.
*
* \sa vmk_BE64ToCPU
*
***********************************************************************
*/
static inline vmk_uint64
vmk_CPUToBE64(vmk_uint64 x)
{
#if defined(__x86_64__) && defined(__GNUC__)
if (!__builtin_constant_p(x)) {
__asm__ ("bswapq %0"
: "=r" (x)
: "0" (x));
return x;
}
#endif
return ((x >> 56) & VMK_CONST64U(0x00000000000000FF)) |
((x >> 40) & VMK_CONST64U(0x000000000000FF00)) |
((x >> 24) & VMK_CONST64U(0x0000000000FF0000)) |
((x >> 8) & VMK_CONST64U(0x00000000FF000000)) |
((x << 8) & VMK_CONST64U(0x000000FF00000000)) |
((x << 24) & VMK_CONST64U(0x0000FF0000000000)) |
((x << 40) & VMK_CONST64U(0x00FF000000000000)) |
((x << 56) & VMK_CONST64U(0xFF00000000000000));
}
/*
***********************************************************************
* vmk_BE64ToCPU -- */ /**
*
* \ingroup Bits
* \brief Convert an unsigned 64 bit unsigned integer in the
* big endian format into a 64 bit unsigned integer in
* the native CPU endian format.
*
* \param[in] x Value to swap
*
* \return Swapped value.
*
* \sa vmk_CPUToBE64
*
***********************************************************************
*/
static inline vmk_uint64
vmk_BE64ToCPU(vmk_uint64 x)
{
return vmk_CPUToBE64(x);
}
/*
***********************************************************************
* vmk_CPUToBE32 -- */ /**
*
* \ingroup Bits
* \brief Convert an unsigned 32 bit unsigned integer in the
* CPU native endian format into a big endian 32 bit
* unsigned integer.
*
* \param[in] x Value to swap
*
* \return Swapped value.
*
* \sa vmk_BE32ToCPU
*
***********************************************************************
*/
static inline vmk_uint32
vmk_CPUToBE32(vmk_uint32 x)
{
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
if (!__builtin_constant_p(x)) {
__asm__ ("bswap %0"
: "=r" (x)
: "0" (x));
return x;
}
#endif
return ((x >> 24) & 0x000000ff) | ((x >> 8) & 0x0000ff00) |
((x << 8) & 0x00ff0000) | ((x << 24) & 0xff000000);
}
/*
***********************************************************************
* vmk_BE32ToCPU -- */ /**
*
* \ingroup Bits
* \brief Convert an unsigned 32 bit unsigned integer in the
* big endian format into a 32 bit unsigned integer in
* the native CPU endian format.
*
* \param[in] x Value to swap
*
* \return Swapped value.
*
* \sa vmk_CPUToBE32
*
***********************************************************************
*/
static inline vmk_uint32
vmk_BE32ToCPU(vmk_uint32 x)
{
return vmk_CPUToBE32(x);
}
/*
***********************************************************************
* vmk_CPUToBE16 -- */ /**
*
* \ingroup Bits
* \brief Convert an unsigned 16 bit unsigned integer in the
* CPU native endian format into a big endian 16 bit
* unsigned integer.
*
* \param[in] x Value to swap
*
* \return Swapped value.
*
* \sa vmk_BE16ToCPU
*
***********************************************************************
*/
static inline vmk_uint16
vmk_CPUToBE16(vmk_uint16 x)
{
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
if (!__builtin_constant_p(x)) {
int bits = 8;
__asm__ ("rolw %%cl, %0"
: "=r" (x)
: "0" (x), "c" (bits));
return x;
}
#endif
return ((x >> 8) & 0x00ff) | ((x << 8) & 0xff00);
}
/*
***********************************************************************
* vmk_BE16ToCPU -- */ /**
*
* \ingroup Bits
* \brief Convert an unsigned 16 bit unsigned integer in the
* big endian format into a 16 bit unsigned integer in
* the native CPU endian format.
*
* \param[in] x Value to swap
*
* \return Swapped value.
*
* \sa vmk_CPUToBE16
*
***********************************************************************
*/
static inline vmk_uint16
vmk_BE16ToCPU(vmk_uint16 x)
{
return vmk_CPUToBE16(x);
}
#endif /* _VMKAPI_BITS_H_ */
/** @} */