En nuestra arquitectura incorporada tenemos un IAB de 64 bits (Buffer de alineación de instrucciones). Para optimizar la secuencia de búsqueda, se requiere que el cuerpo de un bucle comience alineado a un límite de 8 bytes.Cómo alinear el cuerpo C for-loop w/GCC?
Es fácil lograr esto en el ensamblaje utilizando la directiva .balign
, pero no puedo encontrar una sintaxis que sugiera que el compilador de C alinee el código.
Intentar preceder al bucle for con el montaje en línea con la directiva .balign
no funciona, ya que alinea el prólogo de bucle for (configuración) y no el cuerpo del bucle en sí.
Haciendo lo mismo donde la línea asm()
está dentro del lazo, agrega nop
-s al cuerpo del lazo que cuesta ciclos preciosos.
EDIT 1: asume el código:
__asm__ volatile("nop");
__asm__ volatile("nop");
for (j0=0; j0<N; j0+=4)
{
c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
}
Quiero que la primera c=a+b
a alinearse a una dirección de 8 bytes. Puedo agregar el nop
-s como arriba después de una compilación preliminar, pero esta es una solución ad-hoc que se romperá con el primer cambio de código.
EDIT 2: Gracias a @R .., la solución es usar la opción del compilador -falign-loops=8
.
Entonces, en esencia, quiere 'nop'-s que haga que el bucle * body * esté alineado, pero quiere que esos' nop'-s vayan antes del bucle * prolog *? – ruakh
@ruakh - sí, aunque no me importa si los 'nop'-s se generan en el propio prólogo, siempre que la instrucción de bifurcación al final del bucle apunte a una ubicación de memoria alineada. – ysap
Entendido. ¡Esta es una gran pregunta! – ruakh