Implementación vectorizada de CLZ y CTZ mediante aritmética de punto flotante

Fuentes: Vectorized CLZ and CTZ implementation using floating-point arithmetic

El artículo detalla la implementación de instrucciones vectorizadas para calcular el número de bits cero leading (CLZ) y trailing (CTZ) en enteros de 32 bits, utilizando técnicas de aritmética de punto flotante para evitar las instrucciones nativas de CPU. El autor, trabajando en un emulador de FPU, desarrolló un polyfill vectorizable que logra una latencia inferior a la de las instrucciones nativas en arquitecturas como Haswell, donde la instrucción ctz tiene una latencia de 3 ciclos.

Para CLZ, la solución se basa en la relación entre los exponentes de punto flotante y los logaritmos. Se utiliza una constante de sesgo para mapear el valor entero a un exponente, permitiendo calcular el desplazamiento mediante una resta bit a bit. El código compila a instrucciones AVX-512 como vpsubq y vpsrlq, ofreciendo un rendimiento comparable o superior a las instrucciones nativas en ciertos casos, aunque en CPUs AMD Zen la instrucción lzcnt nativa suele ser más eficiente.

Para CTZ, el enfoque es más complejo debido a la necesidad de manejar el caso de números pares. Se emplea una combinación de operaciones XOR y ADD para manipular los bits, y se utiliza una secuencia de De Bruijn para mapear los resultados a índices de una tabla de búsqueda (LUT). Dado que las instrucciones de shuffle de AVX-512 no pueden manejar LUTs de 32 bytes en un solo paso, se utiliza una secuencia de 16 bits repetida para calcular los bits bajos y se añade una constante mágica para completar el cálculo. Esta implementación vectorizada es útil para desarrolladores que requieren precisión extrema o evitan las dependencias de instrucciones específicas de CPU en entornos embebidos o de alto rendimiento.