In unserer eingebetteten Architektur haben wir einen 64-Bit-IAB (Instruction Alignment Buffer). Um die Abrufsequenz zu optimieren, ist es erforderlich, dass der Körper einer Schleife mit einer 8-Byte-Grenze ausgerichtet beginnt.Wie wird C For-Loop-Körper mit GCC ausgerichtet?
Es ist einfach, dies in Assembly mit der .balign
Direktive zu erreichen, aber ich kann keine Syntax finden, die den C-Compiler anweisen wird, den Code auszurichten.
Der Vorlauf der for-Schleife mit Inline-Assembly mit der Direktive .balign
funktioniert nicht, da der for loop-Prolog (Setup) und nicht der Schleifenkörper selbst ausgerichtet wird.
Das Gleiche tun, wo die asm()
Linie innerhalb der Schleife ist, fügt nop
-s dem Schleifenkörper hinzu, der wertvolle Zyklen kostet.
EDIT 1: nimm den Code:
__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];
}
Ich mag die erste c=a+b
auf eine 8-Byte-Adresse auszurichten. Ich kann die nop
-s wie oben nach einer vorläufigen Kompilierung hinzufügen, aber dies ist eine Ad-hoc-Lösung, die mit der ersten Codeänderung brechen wird.
EDIT 2: Dank @R .., ist die Lösung -falign-loops=8
Compiler-Option zu verwenden.
Also im Wesentlichen wollen Sie 'nop'-s, dass die Schleife * Körper * ausgerichtet werden soll, aber Sie wollen diese' nop'-s vor der Schleife gehen * prolog *? – ruakh
@ruakh - ja, obwohl es mir egal ist, ob die 'nop'-s im Prolog selbst generiert werden, solange der Verzweigungsbefehl am Ende der Schleife auf einen ausgerichteten Speicherplatz zeigt. – ysap
Verstanden. Das ist eine gute Frage! – ruakh