48088 {
48089 if (!value_in) {
48090 return 64;
48091 }
48092
48094
48095 constexpr uint64_t index64msb[] = {0, 47, 1, 56, 48, 27, 2, 60, 57, 49, 41, 37, 28, 16, 3, 61,
48096 54, 58, 35, 52, 50, 42, 21, 44, 38, 32, 29, 23, 17, 11, 4, 62,
48097 46, 55, 26, 59, 40, 36, 15, 53, 34, 51, 20, 43, 31, 22, 10, 45,
48098 25, 39, 14, 33, 19, 30, 9, 24, 13, 18, 8, 12, 7, 6, 5, 63};
48099
48100 constexpr uint64_t debruijn64msb = 0X03F79D71B4CB0A89;
48101
48102 value |= value >> 1;
48103 value |= value >> 2;
48104 value |= value >> 4;
48105 value |= value >> 8;
48106 value |= value >> 16;
48107 value |= value >> 32;
48108 auto result = 63 - index64msb[(value * debruijn64msb) >> 58];
48109#ifdef __clang__
48110 D_ASSERT(result ==
static_cast<uint64_t>(__builtin_clzl(value_in)));
48111#endif
48112 return result;
48113 }