WINAVR - prekvapiva optimalizace
Jan Waclawek
konfera@efton.sk
Pátek Prosinec 12 13:45:09 CET 2008
No, po prve, WinAVR nie je prekladac.
Pricina tej zvlastnej optimalizacie je mozno v tom, ze gcc v mnohych optimalizaciach (ktore su robene este vo faze ktora je procesorovo nespecificka) ide tvrdo v linii vlastnosti "velkych" procesorov, a potom je to uz v tom backende ktory je specificky pre AVR tazko napravit.
SDCC ten kusok (musel som k nemu samozrejme dopisat definicie atd.) prelozil napr. takto:
138 ; pp.c:19: DsTSensCount = 10;
0000 75*00 0A 139 mov _DsTSensCount,#0x0A
140 ; pp.c:21: pd = &DsTSensDesc[0];
141 ; pp.c:22: for (idx=0; idx<DsTSensCount; idx++)
0003 7A 34 142 mov r2,#_DsTSensDesc
0005 7B 12 143 mov r3,#(_DsTSensDesc >> 8)
0007 7C 00 144 mov r4,#0x00
0009 145 00101$:
0009 C3 146 clr c
000A EC 147 mov a,r4
000B 95*00 148 subb a,_DsTSensCount
000D 50 1A 149 jnc 00105$
150 ; pp.c:24: pd++->status = TSENS_ERR_HW;
000F 8A 05 151 mov ar5,r2
0011 8B 06 152 mov ar6,r3
0013 74 0F 153 mov a,#0x0F
0015 2A 154 add a,r2
0016 FA 155 mov r2,a
0017 E4 156 clr a
0018 3B 157 addc a,r3
0019 FB 158 mov r3,a
001A 74 0A 159 mov a,#0x0A
001C 2D 160 add a,r5
001D F5 82 161 mov dpl,a
001F E4 162 clr a
0020 3E 163 addc a,r6
0021 F5 83 164 mov dph,a
0023 74 05 165 mov a,#0x05
0025 F0 166 movx @dptr,a
167 ; pp.c:22: for (idx=0; idx<DsTSensCount; idx++)
0026 0C 168 inc r4
0027 80 E0 169 sjmp 00101$
0029 170 00105$:
0029 22 171 ret
wek
----- Original Message ---------------
>No, ja uz se naucil I 3. pravidlo, ze zadny prekladac neni dokonaly a obcas
>neco prelozi I uplne blbe :-) Zvlast tem pro MCU neverim dokud preklad
>nevidim.
>A kratsi jsem myslel na pocet instrukci, tady neni rychlost dulezita. Ale I
>na rychlost by to IMHO vyslo podstatne lepe s pouzitim promenne typu BYTE
>pro pocitani iteraci cyklu. Adresa by se jen pricitala, nemusela by se
>porovnavat v 16b forme a pripravovat koncova adresa dalsimi x instrukcemi.
>Takze v tomto pripade optimalizaci nepovazuji za zdarilou.
Další informace o konferenci Hw-list