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.