Alien-Judy
view release on metacpan or search on metacpan
src/judy-1.0.5/src/JudyCommon/JudyPrivate.h view on Meta::CPAN
word = (word & 0x33333333) + ((word & 0xCCCCCCCC) >> 2);
word = (word & 0x0F0F0F0F) + ((word & 0xF0F0F0F0) >> 4); // >= 8 bits.
#if defined(BITMAP_LEAF16x16) || defined(BITMAP_LEAF32x8)
word = (word & 0x00FF00FF) + ((word & 0xFF00FF00) >> 8); // >= 16 bits.
#endif
#ifdef BITMAP_LEAF32x8
word = (word & 0x0000FFFF) + ((word & 0xFFFF0000) >> 16); // >= 32 bits.
#endif
#else // JU_64BIT
word = (word & 0x5555555555555555) + ((word & 0xAAAAAAAAAAAAAAAA) >> 1);
word = (word & 0x3333333333333333) + ((word & 0xCCCCCCCCCCCCCCCC) >> 2);
word = (word & 0x0F0F0F0F0F0F0F0F) + ((word & 0xF0F0F0F0F0F0F0F0) >> 4);
#if defined(BITMAP_LEAF16x16) || defined(BITMAP_LEAF32x8) || defined(BITMAP_LEAF64x4)
word = (word & 0x00FF00FF00FF00FF) + ((word & 0xFF00FF00FF00FF00) >> 8);
#endif
#if defined(BITMAP_LEAF32x8) || defined(BITMAP_LEAF64x4)
word = (word & 0x0000FFFF0000FFFF) + ((word & 0xFFFF0000FFFF0000) >>16);
#endif
#ifdef BITMAP_LEAF64x4
word = (word & 0x00000000FFFFFFFF) + ((word & 0xFFFFFFFF00000000) >>32);
#endif
#endif // JU_64BIT
return(word);
} // j__udyCountBitsL()
#endif // Compiler supports inline
// GET POP0:
//
// Get from jp_DcdPopO the Pop0 for various JP Types.
//
// Notes:
//
// - Different macros require different parameters...
//
// - There are no simple macros for cJU_BRANCH* Types because their
// populations must be added up and dont reside in an already-calculated
// place. (TBD: This is no longer true, now its in the JPM.)
//
// - cJU_JPIMM_POP0() is not defined because it would be redundant because the
// Pop1 is already encoded in each enum name.
//
// - A linear or bitmap leaf Pop0 cannot exceed cJU_SUBEXPPERSTATE - 1 (Pop0 =
// 0..255), so use a simpler, faster macro for it than for other JP Types.
//
// - Avoid any complex calculations that would slow down the compiled code.
// Assume these macros are only called for the appropriate JP Types.
// Unfortunately theres no way to trigger an assertion here if the JP type
// is incorrect for the macro, because these are merely expressions, not
// statements.
#define JU_LEAFW_POP0(JRP) (*P_JLW(JRP))
#define cJU_JPFULLPOPU1_POP0 (cJU_SUBEXPPERSTATE - 1)
// GET JP Type:
// Since bit fields greater than 32 bits are not supported in some compilers
// the jp_DcdPopO field is expanded to include the jp_Type in the high 8 bits
// of the Word_t.
// First the read macro:
#define JU_JPTYPE(PJP) ((PJP)->jp_Type)
#define JU_JPLEAF_POP0(PJP) ((PJP)->jp_DcdP0[sizeof(Word_t) - 2])
#ifdef JU_64BIT
#define JU_JPDCDPOP0(PJP) \
((Word_t)(PJP)->jp_DcdP0[0] << 48 | \
(Word_t)(PJP)->jp_DcdP0[1] << 40 | \
(Word_t)(PJP)->jp_DcdP0[2] << 32 | \
(Word_t)(PJP)->jp_DcdP0[3] << 24 | \
(Word_t)(PJP)->jp_DcdP0[4] << 16 | \
(Word_t)(PJP)->jp_DcdP0[5] << 8 | \
(Word_t)(PJP)->jp_DcdP0[6])
#define JU_JPSETADT(PJP,ADDR,DCDPOP0,TYPE) \
{ \
(PJP)->jp_Addr = (ADDR); \
(PJP)->jp_DcdP0[0] = (uint8_t)((Word_t)(DCDPOP0) >> 48); \
(PJP)->jp_DcdP0[1] = (uint8_t)((Word_t)(DCDPOP0) >> 40); \
(PJP)->jp_DcdP0[2] = (uint8_t)((Word_t)(DCDPOP0) >> 32); \
(PJP)->jp_DcdP0[3] = (uint8_t)((Word_t)(DCDPOP0) >> 24); \
(PJP)->jp_DcdP0[4] = (uint8_t)((Word_t)(DCDPOP0) >> 16); \
(PJP)->jp_DcdP0[5] = (uint8_t)((Word_t)(DCDPOP0) >> 8); \
(PJP)->jp_DcdP0[6] = (uint8_t)((Word_t)(DCDPOP0)); \
(PJP)->jp_Type = (TYPE); \
}
#else // 32 Bit
#define JU_JPDCDPOP0(PJP) \
((Word_t)(PJP)->jp_DcdP0[0] << 16 | \
(Word_t)(PJP)->jp_DcdP0[1] << 8 | \
(Word_t)(PJP)->jp_DcdP0[2])
#define JU_JPSETADT(PJP,ADDR,DCDPOP0,TYPE) \
{ \
(PJP)->jp_Addr = (ADDR); \
(PJP)->jp_DcdP0[0] = (uint8_t)((Word_t)(DCDPOP0) >> 16); \
(PJP)->jp_DcdP0[1] = (uint8_t)((Word_t)(DCDPOP0) >> 8); \
(PJP)->jp_DcdP0[2] = (uint8_t)((Word_t)(DCDPOP0)); \
(PJP)->jp_Type = (TYPE); \
}
#endif // 32 Bit
// NUMBER OF BITS IN A BRANCH OR LEAF BITMAP AND SUBEXPANSE:
//
// Note: cJU_BITSPERBITMAP must be the same as the number of JPs in a branch.
#define cJU_BITSPERBITMAP cJU_SUBEXPPERSTATE
// Bitmaps are accessed in units of "subexpanses":
#define cJU_BITSPERSUBEXPB (sizeof(BITMAPB_t) * cJU_BITSPERBYTE)
( run in 0.408 second using v1.01-cache-2.11-cpan-5623c5533a1 )