Estoy escribiendo un programa en C que necesita hacer algunos cálculos rápidos de matemáticas. Estoy usando instrucciones de ensamblaje de SSE en línea para obtener alguna acción SIMD (usando números de coma flotante de doble precisión). Estoy compilando usando GCC en Linux.Obtenga GCC para conservar un registro SSE a través de una función que utiliza asm en línea
Estoy en una situación en la que necesito revisar algunos datos, y uso un factor constante en mis cálculos. Me gustaría mantener ese factor escondido en un registro seguro durante el ciclo, por lo que no tengo que volver a cargarlo cada vez.
Aclarar con algo de código:
struct vect2 {
fltpt x;
fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;
void function()
{
/* get a specific value set up in xmm1, and keep it there for the
* rest of the loop. */
for(int i = 0, i<N; i++){
asm(
"Some calculations;"
"on an element of;"
"a data set.;"
"The value in xmm1;"
"is needed;"
);
}
}
He intentado hacer algo con la palabra clave "registro". Pero si no me equivoco, parece que solo puedo conservar un puntero en esa estructura (en un registro general). Esto necesitaría ser referenciado en cada iteración, perdiendo un tiempo precioso.
register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */
register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */
que no sólo me gusta asumir que GCC no cambiará el XMM1 registro, es demasiado de un "demonios que vuelan de la nariz" tipo de cosas :-). Así que espero que haya una forma adecuada de hacer esto.