Die Reihenfolge der Bits in einem Byte umkehren?
...Gibt für [...] ASM bestimmt noch andere Lösungen...
Das sind bereits 14 Schiebeoperationen und 9 logische Verknüpfungen.
Wenn man von einem Register in ein anderes schiebt, käme man mit 8mal schieben und rollen aus, also 16 Instruktionen (Takten)...
Bestimmt gibts noch was mit SWAPpen, aber dazu ist der Abend zu weit
Edit: hast Du ja quasi da zu stehen, die Zeile mit 0x0F und 0xF0 könnte durch das SWAP (eine Instruktion, ein Takt, ein Word im Flash) ersetzt werden...
ABER ich bin mir da nicht sicher, ob die "byte=bla or blub" nicht noch ein paar Kopierinstruktionen enthält. Bla und Blub benötigen ja beide das Originalbyte VOR dem OR und dem schieben
Edit2: gerade und ungerade Bits tauschen, wie bei Dir also die ungeraden Bits maskieren (byte ANDI 0xAA), rechtsschieben, die geraden Bits maskieren (byte2 ANDI 0x55) linksschieben und beide verORren. Byte2 muß aus Byte kopiert werden, bevor dieses maskiert und geschoben wird. Ich zähle 6 Eintakt-Instruktionen.
Bei den Pärchen (mit 0x33 und 0xCC) dasselbe, nur daß je zweimal geschoben wird - 8 weitere Instruktionen.
Die Nibbels (0xF0 und 0x0F) schlügen dann wegen der je 4 shifts mit 12 Instruktionen zu Buche. Wenn man das durch die Ein-Takt-Instruktion SWAP ersetzt, bliebe man mit 15 Instruktionen/Takten tatsächlich einen Takt schneller als beim Schieben/Rollen...
(@Thomas: wieweit die Himbeere da den Code optimiert, und ob die sowas wie SWAP kennt, weiß ich(!) natürlich nicht, aber im AVR würde der Nibbeltausch mit SWAP die Takte nahezu halbieren)
Hab ich mich vertan, Dino?
Und noch'n Edit: wenn's von der Zeit her nur schnell sein soll, und SRAM/FLASH/EEPROM-Verbrauch keine Rolle spielt, könnte man die Bytes auch in umgekehrter Reihenfolge irgendwo als Tabelle ablegen (also 0b11111111, 0b11111110, 0b11111101, ..., 0b00000001, 0b00000000) und dann einfach das zu invertierende Byte mit "irgendwo" addiert als Adresse auf einen Tabelleneintrag nutzen, und das Byte von da laden. Sollte zumindest im FLASH (mit LPM) und im SRAM (LD) unschlagbar schnell sein - kostet dort allerdings auch 256 Bytes Speicher...