Wie man GCC sagen, dass ein Zeiger-argument ist immer double-word-aligned?

In meinem Programm habe ich eine Funktion, welche eine einfache addition c[0:15] = a[0:15] + b[0:15]. Der Funktionsprototyp lautet:

void vecadd(float * restrict a, float * restrict b, float * restrict c);

Auf unsere 32-bit-embedded-Architektur gibt es eine load/store-option laden/speichern von doppelten Worte, wie:

r16 = 0x4000  ;
strd r0,[r16] ; stores r0 in [0x4000] and r1 in [0x4004]

Den GCC-optimizer erkennt die vector Art der Schleife und erzeugt zwei Zweige der code - eine für den Fall, wo die 3 arrays double-word-aligned (so verwendet er das double load/store-Anweisungen) und die andere für den Fall, dass die arrays sind Wort-ausgerichtet (wobei es nutzt die single-load/store-option).

Das problem ist, dass die Adresse, die Ausrichtung zu überprüfen ist teuer, relativ zu der neben der Teil und das möchte ich beseitigen, indem hinting der compiler, dass a, b und c sind immer 8-ausgerichtet. Gibt es einen Modifikator hinzufügen, um die pointer-Erklärung zu sagen, das der compiler nicht?

Den arrays, die sind verwendet für den Aufruf dieser Funktion haben ausgerichtet(8) Attribut, aber es spiegelt sich nicht in der Funktion code selbst. ist es möglich dieses Attribut hinzufügen, um die Parameter für die Funktion?

  • Auch wenn mein code unten nicht helfen können (wegen C++), möchten Sie vielleicht printf("%p") &array[0] und &array[1] in deinem code, nur um sicherzugehen, dass das ausrichten wird gehorcht, und pro element - nicht nur auf die array-Startadresse.
  • ist es eigentlich erforderlich, dass es NICHT richten pro array-element. Es muss schon eine zusammenhängende Reihe von Schwimmern, deren Herkunft 8-ausgerichtet.
InformationsquelleAutor ysap | 2012-03-07
Schreibe einen Kommentar