Gast
#512649
Gibt es in GCC auch den SWAP Befehl analog zu Assembler der das untere mit dem oberen Nibbel bei einem Byte vertauscht? Danke schonmal
|
Anzeige
|
SWAP in GCC
Gast
#512649
Gibt es in GCC auch den SWAP Befehl analog zu Assembler der das untere mit dem oberen Nibbel bei einem Byte vertauscht? Danke schonmal
Gast
#512661
Geht mit inline Assembler: http://www.roboternetz.de/wissen/index.php/Inline-Assembler_in_avr-gcc#swap_Nibbles
Gast
#512703
Wenns nicht DERMASSEN(!!) schnell gehen muss..... warum nicht einfach in C mit einer Hilfsvariablen: tmpbyte = swapbyte; swapbyte = <<=4; tmpbyte >>=4; swapbyte |= tmpbyte; Setzt der Compiler normal 1:1 um. Grüßle
Gast
#512743
hättest du gesucht, hättest du das gefunden
vorher ggf. nach unsigned casten
Gast
#512744
oups! natürlich:
sorry
Gast
#512774
> Geht mit inline Assembler:
Der Code, den man dort sieht:
kann übrigens noch einen Tick verbessert werden. Inline-Assembler verhindert leider ein "constant folding", weshalb diese Berechnung auch in den Fällen zur Laufzeit durchgeführt wird, in denen es eigentlich nicht nötig wäre. Es gibt bei gcc einen Trick, um auch diese Optimierungen zu ermöglichen. Der geht so:
__builtin_constant_p wird zur Compileeit ausgewertet, wodurch das if() auch zur Compilezeit aufgelöst wird. Wenn swap() inline expandiert wird, wird ein zur Compilezeit bekannter übergebener Wert als solche erkannt und die C-Implementation verwendet, die dann ebenfalls zur Compilezeit durchgeführt wird.
Gast
#512784
@Jörg "oups! natürlich: swapbyte = (swapbyte << 4) & (swapbyte >> 4); sorry" Sollte da nicht ein | anstatt des & stehen?!
Gast
#512785
Doch, sollte es.
Gast
#512811
@ Walter (Gast): autsch, ja natürlich!
Gast
#513024
Vielen Dankfür die schnelle Hilfe. Habe wieder was gelernt. Klasse Forum. Bis dann 73 & 55 Bei mir optimiert der Compiler leider a = (a<<4) | (a>>4); überhaupt nicht zu einem SWAP Befehl. Aus
wird ein völlig umständliches
mit einem Typecast
sieht es nur geringfügig besser aus:
Der GCC Compiler ist: 3.4.3 Besser als das zweite wird's wohl im Moment nicht. Es müsste jemand, der hinreichend viel RTL versteht, sich mal hinsetzen und gucken, wie man es erreicht, dass er die überflüssigen 4 Befehle einfach weglässt. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|