Multiplikation
- Es werden an vielen Stellen, wo früher die nativen mul Befehle des Controllers verwendet wurden 8- und 16bit Variablen auf 32bit aufgebläht und eine Funktion fpc_mul_dword aufgerufen.
Enumerations
- Es werden auch bei Aufzählungen mit einstelliger Anzahl 32bit-Variablen angelegt, und man muss den Compiler mit {$PACKENUM 1} zur Verwendung von Bytes zwingen. Laut Beschreibung sollte der Compiler immer die kleinstmögliche Variable verwenden.
Vergleiche
- Es werden bei Vergleichen mit 16bit-Varibalen, die überlaufen könnten, alle Variablen auf 32bit erweitert, und die Vergleiche entsprechend aufwendiger.
Code: Alles auswählen
if aaa > bbb + 10 then begin ...
Code: Alles auswählen
lds r22,(U_sPsTEST_ss_BBB)
lds r23,(U_sPsTEST_ss_BBB+1)
mov r20,r1
mov r21,r1
ldi r18,40
add r22,r18
adc r23,r1
adc r20,r1
adc r21,r1
lds r24,(U_sPsTEST_ss_AAA)
lds r25,(U_sPsTEST_ss_AAA+1)
cp r22,r24
cpc r23,r25
cpc r20,r1
cpc r21,r1
- jedesmal die doppelte Anzahl Befehle abgearbeitet wird
- die entsprechenden Register natürlich auch freigemacht werden müssen
- vor allem anstatt der effizienten mul-Befehle eine wenig effiziente und zeitraubende Software-Multiplikation aufgerufen wird
Warum dieser Rückschritt in der Embedded AVR Compilerentwicklung? Und wird das wieder besser? Ist das ein Fall für einen Bugreport? So ist eine effiziente Programmierung nicht möglich.
Ich verwende für Embedded AVR den aktuellen Trunk. Und Optimierung steht auf -O3, aber auch auf -O4 wird das nicht besser.