Para un proyecto de hobby en el que estoy trabajando, necesito emular ciertas operaciones enteras de 64 bits en una CPU x86, y debe ser rápido.Emulación SSE optimizada de enteros de 64 bits
Actualmente, estoy haciendo esto a través de instrucciones MMX, pero eso es realmente un dolor de trabajar, porque tengo que lavar el estado de registro fp todo el tiempo (y porque la mayoría de instrucciones MMX se ocupan de firmado enteros, y Necesito un comportamiento sin firmar).
Así que me pregunto si los gurús de SSE/optimización aquí en SO pueden llegar a una mejor implementación utilizando SSE.
Las operaciones que necesito son las siguientes (bastante específicos):
uint64_t X, Y;
X = 0;
X = 1;
X << 1;
X != Y;
X + 1;
X & 0x1 // get lsb
X | 0x1 // set lsb
X > Y;
Específicamente, no necesito Además de propósito general o el paso de, por ejemplo, basta con añadir una e izquierda de desplazamiento de uno. Realmente, solo las operaciones exactas se muestran aquí.
Excepto, por supuesto, en x86, uint64_t
se emula utilizando dos escalares de 32 bits, que es lento (y, en mi caso, simplemente no funciona, porque necesito que las cargas/tiendas sean atómicas, lo que no lo serán al cargar/almacenar dos registros separados).
Por lo tanto, necesito una solución SIMD. Algunas de estas operaciones son triviales, ya soportadas por SSE2. Otros (!=
y <
) requieren un poco más de trabajo.
Sugerencias? SSE y SSE2 están bien.Haría falta un poco de persuasión para permitir SSE3 y SSE4 es, probablemente, fuera de la cuestión (una CPU que soporta SSE4 es probable que se ejecute de 64 bits todos modos, por lo que no necesito estas soluciones)
La adición de entero de 64 bits se admite directamente en SSE2. Supongo que también necesita multiplicaciones de 64 bits. 64 x 64 -> 64 bits (mitad inferior), o ¿necesita 64 x 64 -> 128 bits? – Mysticial
No es necesario multiplicar, solo las operaciones específicas que mostré arriba (por lo tanto, ni siquiera general, simplemente incremente en 1. Y sí, además de SSE2, pero pensé que también podría mostrar todas las operaciones que necesitaba, para completar. Solo significa que algunos de ellos son fáciles :) – jalf
¿A qué quieres que lleguen los operadores lógicos? Registro general? o SSE? – Mysticial