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
http://www.rn-wissen.de/index.php/Inline-Assembler_in_avr-gcc#swap_Nibbles
1 | |
2 | |
3 | |
4 | |
5 | |
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.
was spricht gegen:
1 | |
Ein halbwegs vernünftiger compiler sollte dann ein swp draus machen.
Gast
#2829073
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.
Gast
#2829090
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
1 | |
Ist aber natürlich auch nicht portabel.
Gast
#2829094
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?
Peter II schrieb: > 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. http://sdcc.svn.sourceforge.net/viewvc/sdcc/trunk/sdcc/src/avr/gen.c?revision=8097&view=markup in Zeile 3116:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
Ich wette stark darauf, zumindest für diesen compiler, beim avr-gcc kann man ja auch mal gucken ;-)
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:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Gruß Oliver
Oliver J. schrieb: > Mit -Os erledigt der avr-gcc die swap-Geschichte in C zuverlässig: >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
> > Gruß Oliver Sehr schön, damit hätten wir das eindeutig geklärt (und die Wette hätte ich gewonnen ^^)...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.