El siguiente código llama a las funciones integradas para clz/ctz en GCC y, en otros sistemas, tiene versiones C. Obviamente, las versiones C son un poco subóptimas si el sistema tiene una instrucción clz/ctz incorporada, como x86 y ARM.¿Cómo usar los intrínsecos de MSVC para obtener el equivalente de este código GCC?
#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
¿Qué funciones tengo que llamar, que encabezados Qué necesito incluir, etc añadir un ifdef adecuada para MSVC aquí? Ya he consultado this page, pero no estoy del todo seguro para qué es #pragma (¿es necesario?) Y qué restricciones impone a los requisitos de la versión MSVC para la compilación. Como alguien que realmente no usa MSVC, tampoco sé si estos intrínsecos tienen C equivalentes en otras arquitecturas, o si también tengo que #ifdef x86/x86_64 cuando #definirlos.
La página se hace referencia a anterior se refiere a una función que es parte del tiempo de ejecución de .NET, estás tratando de construir su programa para .NET o como un ejecutable nativo de Windows ? –
Es un ejecutable nativo de Windows. Parte de la razón por la que estoy preguntando es que me ha resultado bastante difícil encontrar páginas de documentación de Microsoft que realmente hablen de C en estos días. –
Implementación de Libcxx https://github.com/llvm-mirror/libcxx/blob/9dcbb46826fd4d29b1485f25e8986d36019a6dca/include/support/win32/support.h#L106-L182 – KindDragon