Nella nostra architettura incorporata abbiamo un IAB a 64 bit (Istruzione Allineamento Buffer). Per ottimizzare la sequenza di recupero, è necessario che il corpo di un loop venga allineato a un limite di 8 byte.Come allineare il corpo per il ciclo C con GCC?
È facile ottenere questo risultato in assembly utilizzando la direttiva .balign
, ma non riesco a trovare una sintassi che suggerisca al compilatore C di allineare il codice.
Il tentativo di precedere il ciclo for con il montaggio in linea con la direttiva .balign
non funziona in quanto allinea il prolog per il ciclo (setup) e non il corpo del loop stesso.
Facendo lo stesso quando la linea asm()
si trova all'interno del ciclo, aggiunge nop
-s al corpo del ciclo che è costato cicli preziosi.
EDIT 1: assumere il codice:
__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];
}
voglio il primo c=a+b
da allineare a un indirizzo di 8 byte. Posso aggiungere il nop
-s come sopra dopo una compilazione preliminare, ma questa è una soluzione ad-hoc che si interromperà con la prima modifica del codice.
MODIFICA 2: Grazie a @R .., la soluzione è utilizzare l'opzione del compilatore -falign-loops=8
.
Quindi, in sostanza, vuoi 'nop'-s che farà sì che il loop * body * sia allineato, ma vuoi che' nop'-s vada prima del ciclo * prolog *? – ruakh
@ruakh - sì, anche se non mi interessa se i 'nop'-s sono generati nel prologo stesso, a patto che l'istruzione branch alla fine del loop punti verso una posizione di memoria allineata. – ysap
Capito. Questa è una bella domanda! – ruakh