Как использовать встроенные функции MSVC, чтобы получить эквивалент этого кода GCC?

Следующий код вызывает встроенные функции для clz / ctz в GCC и в других системах имеет C-версии. Очевидно, что версии C немного неоптимальны, если в системе есть встроенная инструкция clz / ctz, например, x86 и ARM.

#ifdef __GNUC__
#define clz(x) __builtin_clz(x)
#define ctz(x) __builtin_ctz(x)
#else
static uint32_t ALWAYS_INLINE popcnt( uint32_t x )
{
    x -= ((x >> 1) & 0x55555555);
    x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
    x = (((x >> 4) + x) & 0x0f0f0f0f);
    x += (x >> 8);
    x += (x >> 16);
    return x & 0x0000003f;
}
static uint32_t ALWAYS_INLINE clz( uint32_t x )
{
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> 8);
    x |= (x >> 16);
    return 32 - popcnt(x);
}
static uint32_t ALWAYS_INLINE ctz( uint32_t x )
{
    return popcnt((x & -x) - 1);
}

#endif

Какие функции мне нужно вызывать, какие заголовки мне нужно включить и т. Д., Чтобы добавить правильный ifdef для MSVC здесь? Я уже посмотрел наэта страница, но я не совсем уверен, для чего нужна #pragma (она требуется?) и какие ограничения она накладывает на требования к версии MSVC для компиляции. Как человек, который на самом деле не использует MSVC, я также не знаю, есть ли у этих встроенных компонентов эквиваленты C в других архитектурах, или мне также нужно #ifdef x86 / x86_64 при # определении их.

Ответы на вопрос(4)

Ваш ответ на вопрос