AVR Studio, Atmega32
Hallo,
Gibt es einen Swap-Befehl, um eingelesene high und low Bits zutauschen
und wie sieht der aus ?
Also mache
0101 1100 (0x5C)
zu
1100 0101 (0xC5)
mit __builtin_avr_insert_bits könnte das (und noch viel mehr) gehen,
aber ob's schneller ist als per Hand maskieren und schieben?
oder meintest du in ASM?
Εrnst B✶ schrieb:> mit __builtin_avr_insert_bits könnte das (und noch viel mehr) gehen,> aber ob's schneller ist als per Hand maskieren und schieben?>> oder meintest du in ASM?
__builtin_avr_insert_bits sagt mir nichts!
Per Hand wäre es möglich. Dachte aber es gibt einen Befehl dafür in C
Meinst du so? Einziger Nachteil (vielleicht): Hilfsfunktion musst du
u.U. auf anderen Prozessor anpassen. Falls das kein low level Code ist -
wobei ja dann eher swappen unwichtiger würde.
Stefan Noack schrieb:> Ein halbwegs vernünftiger compiler sollte dann ein swp draus machen.
daruf würde ich nicht wetten.
schon ein
x >> 4
ist auf einem atmel langsam, weil es in 4 schritten gemacht werden muss.
Clemens M. schrieb:> http://www.rn-wissen.de/index.php/Inline-Assembler...>> static inline unsigned char swap (unsigned char x)> {> asm volatile ("swap %0" : "=r" (x) : "0" (x));> return x;> }>>> Meinst du so? Einziger Nachteil (vielleicht): Hilfsfunktion musst du> u.U. auf anderen Prozessor anpassen. Falls das kein low level Code ist -> wobei ja dann eher swappen unwichtiger würde.
Das gibts schon als intrinsic function im Header: avr/builtin.h
schon ein
x >> 4
ist auf einem atmel langsam, weil es in 4 schritten gemacht werden muss.
und was spricht dagegen (zumindest bei unsigned), das mit swap und and
(0f) zu machen?
eProfi schrieb:> und was spricht dagegen (zumindest bei unsigned), das mit swap und and> (0f) zu machen?
dass der compiler einem die arbeit normalerweise abnimmt, das so zu
schreiben? (siehe oben) ansonsten kann man gleich in assembler schreiben
(was ich übrigens durchaus befürworte)...
Peter II schrieb:> schon ein> x >> 4>> ist auf einem atmel langsam, weil es in 4 schritten gemacht werden muss.
Der avr-gcc erledigt das aber mit swap und andi und nicht über
Schiebebefehle oder add. Also braucht das nur 2 Zyklen.
(Betrachtung ohne Speicherzugriffe)
Mit -Os erledigt der avr-gcc die swap-Geschichte in C zuverlässig: