mezi zidli a klavesnici
Jaroslav Buchta
jaroslav.buchta na hascomp.cz
Úterý Únor 28 16:57:22 CET 2012
Produkt AVRGCC pro XMEGA
for (i=0; i<5; i++) Sum += Pole[i];
24e: 29 81 ldd r18, Y+1 ; 0x01
250: 3a 81 ldd r19, Y+2 ; 0x02
252: 8b 81 ldd r24, Y+3 ; 0x03
254: 9c 81 ldd r25, Y+4 ; 0x04
256: 28 0f add r18, r24
258: 39 1f adc r19, r25
25a: 8d 81 ldd r24, Y+5 ; 0x05
25c: 9e 81 ldd r25, Y+6 ; 0x06
25e: 28 0f add r18, r24
260: 39 1f adc r19, r25
262: 8f 81 ldd r24, Y+7 ; 0x07
264: 98 85 ldd r25, Y+8 ; 0x08
266: 28 0f add r18, r24
268: 39 1f adc r19, r25
26a: 89 85 ldd r24, Y+9 ; 0x09
26c: 9a 85 ldd r25, Y+10 ; 0x0a
26e: 28 0f add r18, r24
270: 39 1f adc r19, r25
;-)
Zdrojak:
int main(void)
{
char i;
int Sum;
volatile int Pole[5] = {1,2,3,4,5};
for (i=0; i<5; i++) Sum += Pole[i];
return Sum;
}
to volatile a return je tam kvuli tomu, ze jinak to zoptimalizuje
totalne (zadny soucet se neprovede, protoze neni vysledek potreba nebo
secte konstanty)...
Volba optimalizace na Os
Dne 28.2.2012 11:26, Andrej Jancura napsal(a):
> 2012/2/28 Michal Gregor<a2x1nptda8 na email.cz>:
>>> for i=0 to 5
>>> Soucet += Pole[i]
>>> Toto znamena, nastav i, vypocitaj adresu prvku, indexovo zober
>>> hodnotu, pricitaj k vysledku, inkrementuj i, porovnaj i na koniec...
>>
>> Toto znamena secti pole a moderni prekladac by to MOHL poznat a
>> optimalizovat. Tedy v pripade ze pole neni dynamicke a je ulozeno na fixni
>> adrese.
>> (Pro dynamicke pole je to nesmysl)
> Mozem sa spytat, vy taky moderny prekladac poznate? Lebo ja nie... A
> uz vonkoncom nie taky aby bol navyse zadarmo. Mohol by to vediet robit
> PicC PRO ten s tymi optimalizaciami, ale uz vidim velku vacsinu, ako
> plati 1400$ za komplikator...
>
> A.
>
>
>> Michal Gregor
>>
>> ----- Original Message ----- From: "Andrej Jancura"<aj.hwlist na gmail.com>
>> To: "HW-news"<hw-list na list.hw.cz>
>> Sent: Tuesday, February 28, 2012 11:07 AM
>>
>> Subject: Re: mezi zidli a klavesnici
>>
>>
>> Myslim, ze ste nepochopili, co sa deje v asembleri...
>>
>> 2012/2/28 Michal Gregor<a2x1nptda8 na email.cz>:
>>> Prekladace neumi pracovat poradne s pointery ve smycce. Takze v C staci se
>>> vybodnout na cykly a hned to bezi rychleji. Treba toto:
>>> for i=0 to 5
>>> Soucet += Pole[i]
>>
>> Toto znamena, nastav i, vypocitaj adresu prvku, indexovo zober
>> hodnotu, pricitaj k vysledku, inkrementuj i, porovnaj i na koniec...
>>
>>> Je lepsi zapsat
>>> Soucet += Pole[0]
>>
>> Toto naproti tomu znamena pricitaj k vysledku hodnotu na pevnej adrese
>> prvku pola, co je podla mna jedna trivialna asm instrukcia...
>>
>>> Soucet += Pole[1]
>>> Soucet += Pole[2]
>>> Soucet += Pole[3]
>>> Soucet += Pole[4]
>>> Soucet += Pole[5]
>>>
>>> Vypada do dlouze, ale po prelozeni je to obvykle kratsi a nekolikanasobne
>>> rychlejsi
>>>
>> A uz viete aj preco to tak je...
>>
>> A.
>>
>>> Michal Gregor
>>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list