WinAVR auch ohne Union optimierter Code möglich?

Persönliche Seite #2009970
Lesenswert?

Karl heinz Buchegger schrieb:

>   *(uint8_t*)&my_int |= my_byte;

Von solchen Hacks würde ich dringend abraten. Type Punning kann 
einerseits zu unerwünschten Optimierungen führen und ist andererseits 
alles andere als hübsch.

@Ingo

Wenn du mit den 3-4 überflüssigen Ticks absolut nicht leben kannst: 
Verwende (Inline)-Assembler, nur der gibt dir garantiert bestimmte 
asm-Sequenzen.
Zudem ein Bugreport für die neueste GCC-Version (4.5.2 bzw. 4.6.0) 
machen, damit diese Optimierung vielleicht irgendwann Teil von avr-gcc 
wird.

Innerhalb von avr-gcc ist das Problem, daß es keinen Königsweg betreffs 
Subreg-Lowering gibt. Dieses geschieht in Pass .149r.subreg1 und 
.182r.subreg2 (in den Dumps mit -da)

Je nach Kontext ist es manchmal günstiger, dieses Lowering zu machen 
(also breite Variablen in 8-Bit-Stücke aufzuspalten), oder aber eine 
Variable in einem Stück zu belassen, so daß nachvollziehbar bleibt, was 
mit ihr geschieht: Ein Haufen von 8-Bit-Fragmenten ist eben nicht immer 
hilfreich...

Die Subreg-Lowering-Passes können mit -f[no-]split-wide-types 
aktiviert/deaktiviert werden, allerdings wird der Schalter nicht im 
avr-Backend berücksichtigt, und je nach Verschalterung sieht ein Backend 
andere Pattern und ist nicht auf deren Verarbeitung/Optimierung 
vorbereitet -- zumindest ist's im avr-Backend so.
OP #2010200
Lesenswert?

@Johann
Mir ging es eher um den Flash-Speicher, bin mal wieder kurz vor der 4K 
Grenze. Aber was solls, mit Union's geht das ja sauber. Ich muss nur 
halt den Code auf die Unions umbauen.

@Rolf
> my_int = (uint8_t)my_int | my_byte;
Den Versuch habe ich hinter mir  - und wech ist der Balkon ääh, das 
highByte. Der Compiler macht genau das was man ihm sagt ;-)

Gruß Ingo

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren