HPC? High Performance Code? Hilbert-Proof-Calculus?
Naja, ich bin auch überzeugt, dass llm's swap32 leicht beweisbar korrekt ist:
Jeder Term der bitweisen Veroderung beeinflusst genau 8 Bits, und es sind jeweils die richtigen für den Big↔Little-Endian-Swap.
Durch die Kompaktheit lässt sich die Funktion auch gut lesen.
Aber eigentlich will man hier ja doch, dass der Compiler am Ende wieder ein bswap im Assembler erzeugt, oder?
__builtin_bswap32 (GCC/Clang) bzw. _byteswap_ulong (MSVC) dürften daher die schnellste und, im Gegensatz zu Inline-Asm, plattformunabhängigere Variante sein.
Der alte Code hatte gegen Strict-Aliasing (und Alignment) verstoßen, vermutlich daher undefiniertes Verhalten (bei höheren Optimierungsstufen):
Edit: Ups, da war ich zu langsam, interessante Analyse llm!.
Naja, ich bin auch überzeugt, dass llm's swap32 leicht beweisbar korrekt ist:
Jeder Term der bitweisen Veroderung beeinflusst genau 8 Bits, und es sind jeweils die richtigen für den Big↔Little-Endian-Swap.
Durch die Kompaktheit lässt sich die Funktion auch gut lesen.
Aber eigentlich will man hier ja doch, dass der Compiler am Ende wieder ein bswap im Assembler erzeugt, oder?
__builtin_bswap32 (GCC/Clang) bzw. _byteswap_ulong (MSVC) dürften daher die schnellste und, im Gegensatz zu Inline-Asm, plattformunabhängigere Variante sein.
Der alte Code hatte gegen Strict-Aliasing (und Alignment) verstoßen, vermutlich daher undefiniertes Verhalten (bei höheren Optimierungsstufen):
Code:
int16_t a[2];
int32_t *ptr = (int32_t*)(&a[0]);Edit: Ups, da war ich zu langsam, interessante Analyse llm!.

