8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-24 15:23:03 +01:00
firebird-mirror/extern/libcds/cds/compiler/gcc/ia64/bitop.h

66 lines
2.0 KiB
C
Raw Normal View History

// Copyright (c) 2006-2018 Maxim Khizhinsky
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef CDSLIB_COMPILER_GCC_IA64_BITOP_H
#define CDSLIB_COMPILER_GCC_IA64_BITOP_H
//@cond none
namespace cds {
namespace bitop { namespace platform { namespace gcc { namespace ia64 {
// MSB - return index (1..32) of most significant bit in x. If x == 0 return 0
# define cds_bitop_msb32_DEFINED
static inline int msb32( uint32_t nArg )
{
if ( !nArg )
return 0;
uint64_t x = nArg;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
uint64_t nRes;
asm __volatile__( "popcnt %0=%1\n\t" : "=r" (nRes) : "r" (x));
return (int) nRes;
}
// It is not compiled on HP-UX. Why?..
#if CDS_OS_TYPE != CDS_OS_HPUX
// MSB - return index (0..31) of most significant bit in nArg.
// !!! nArg != 0
# define cds_bitop_msb32nz_DEFINED
static inline int msb32nz( uint32_t nArg )
{
assert( nArg != 0 );
long double d = nArg;
long nExp;
asm __volatile__("getf.exp %0=%1\n\t" : "=r"(nExp) : "f"(d));
return (int) (nExp - 0xffff);
}
// MSB - return index (0..63) of most significant bit in nArg.
// !!! nArg != 0
# define cds_bitop_msb64nz_DEFINED
static inline int msb64nz( uint64_t nArg )
{
assert( nArg != 0 );
long double d = nArg;
long nExp;
asm __volatile__("getf.exp %0=%1\n\t" : "=r" (nExp) : "f" (d));
return (int) (nExp - 0xffff);
}
#endif // #if CDS_OS_TYPE != CDS_OS_HPUX
}} // namespace gcc::ia64
using namespace gcc::ia64;
}}} // namespace cds::bitop::platform
//@endcond
#endif // #ifndef CDSLIB_COMPILER_GCC_IA64_BITOP_H