Hallo,
mir ist gerade aufgefallen, dass avr-g++ (im Gegensatz zu avr-gcc)
folgendes nicht durchoptimiert:
1 | volatile signed char s;
|
2 | volatile unsigned char i;
|
3 | int main() {
|
4 | s += i;
|
5 | }
|
avr-g++ macht daraus:
1 | volatile signed char s;
|
2 | volatile unsigned char i;
|
3 | int main() {
|
4 | s += i;
|
5 | 7c: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <_edata>
|
6 | 80: 20 91 61 00 lds r18, 0x0061 ; 0x800061 <s>
|
7 | 84: 90 e0 ldi r25, 0x00 ; 0
|
8 | 86: 82 0f add r24, r18
|
9 | 88: 91 1d adc r25, r1
|
10 | 8a: 27 fd sbrc r18, 7
|
11 | 8c: 9a 95 dec r25
|
12 | 8e: 80 93 61 00 sts 0x0061, r24 ; 0x800061 <s>
|
13 | for (;;) {
|
14 |
|
15 | }
|
avr-gcc dagegen optimiert das obere Byte weg:
1 | volatile signed char s;
|
2 | volatile unsigned char i;
|
3 | int main() {
|
4 | s += i;
|
5 | 7c: 80 91 60 00 lds r24, 0x0060 ; 0x800060 <_edata>
|
6 | 80: 90 91 61 00 lds r25, 0x0061 ; 0x800061 <s>
|
7 | 84: 89 0f add r24, r25
|
8 | 86: 80 93 61 00 sts 0x0061, r24 ; 0x800061 <s>
|
9 | }
|
Vermutlich greift ein Pattern nicht beim Optimieren.
Ich schreibs hierher, da ich z.Zt. keine Möglichkeit habe, mich auf dem
Bugzilla anzumelden und es bis dahin sicher wieder vergessen habe...
Danke und Grüße,
Nase