Andy wrote:
> Die vielen Treffer bei Google hatte ich auch, nur hab ich aus der Liste
> wohl die richtigen Infos nicht gefunden.
>
> Also wenn ich das richtig seh, bleibt mir wohl nichts anders übrig als
> das über ne union zu lösen. Die oben geschriebene Zeigervariante is halt
> so schön einfach,
Nein, einfach finde ich das nicht. Schau mal an, welcher Code erzeugt
wird, zB mit -save-temps -fverbose-asm (find ich aussagekräftiger als
Dumps aus dem Assembler raus. Assemble wird damit geschrieben nach foo.s
anstatt nach /tmp )
Adressen von Registern zu nehmen erfordert, daß für die Funktion ein
Frame angelegt wird. Die Register werden gepushd, um Adresse nehmen zu
können.
Mit einer Union kann das mit Register-Variablen geschehen (zumindest,
wenn die Größe der Union "gerade" ist, also zB 1, 2, 4).
> aber zugegebenermassen wohl doch etwas 'dirty'.
> Die Funktion des Codes ist bei -O2 und -O3 genau wie gewünscht, aber
> Lösung 1) gefällt mir eigentlich nicht, wer weiss was dann alles für
> berechtigte Warnings in Zukunft mit unterdrückt werden.
-fno-strict-aliasing unterdrückt keine Warnungen, sondern schaltet die
entsprechende Optimierungen ab, d.h. solche, die unter der Annahme von
strict-aliasing korrekt sind. Ohne die Option bleiben die Optimierungen
eben aus, und damit auch Warungen, die damit im Zusammenhang stehen.
Ich schätze mal, diese Option führt kaum zu großartig
besserem/schlechterem Code. Zudem kann man den Schalter gezielt auf die
fraglichen Module anwenden.
Da es hier offenbar um Performance-Tweaks für ein Target mit FPU geht,
bietet sich auch (Inline) Assembler an. Es müssen ja nur die Args in
FPU-Register verteilt/abgeholt werden.
Weiß ja nicht, was Du vorhast, aber es kann durchaus lohnen sein,
foo-gcc selbst anzupassen. Das würde den Call-Overhead sparen und das
Register-Kopieren, zudem kann man genau sagen, welche REGs verwendet
werden, und wie lange auf die FPU gewartet werden muss, etc.