Automaticke pretypovani u AVR-GCC
Tomáš Halabala
tomas.halabala@iol.cz
Středa Červenec 22 21:09:41 CEST 2009
Milan B. napsal(a):
> Obavam sa, ze to riesenie nie je.
Jak se to vezme. Je to reseni jak premluvit GCC, aby pri optimalizaci
konverzi vyskrtnul. A pri prechodu na novou verzi nebo jiny kompilator
se nemuze nic zkazit, coz je dulezite.
>
> Najprv trochu vyskumu:
>
> Vezmime si tri pripady:
>
> A. if ( 3 & Status) ...
> B. if ( 3==(3 & Status) ...
> C. if ( ss = (3 & Status ) ... // ss je tiez unsigned char
>
> Pri skompilovani avr-gcc (verzia 4.3.2) *bez optimalizacie* pripady A aj
> B su skompilovane ako 16-bitove, pripad C je skompilovany ako 8-bitovy.
> Pokial zapneme optimalizaciu, tak aj pripad B sa zmeni na 8-bitovy
> (napriek tomu, ze je tam to cislo 3)
Vidite a jsme u te "nalady". Pouzivam stejnou verzi prekladace a pripad
B je nekdy skompilovany ako 8-bitovy a nekdy ako 16-bitovy.
>
> Avsak ci uz je optimalizacia zapnuta alebo nie, vyrazy v pripadoch A a B
> su vyhodnocovane ako 16-bitove. Pripad B je upraveny az pri neskorsej
> optimalizacii - prezretim dump suborov (avr-gcc -fdump-rtl-all) sa da
> presne zistit, kedy sa to stalo (and:HI (half-integer )sa zmeni na
> and:QI (quarter-integer)). Z tychto dumpov je tiez viditelne, ze oba
> pripady A a B boli povodne vyhodnotene ako 16-bitove a C ako 8-bitovy
>
> Takze tu vznika domnienka: GCC sa snazi co najviac pracovat s operandmi
> v nativnej sirke slova, predpokladajuc ze CPU s takymito operandmi vie
> pracovat najefektivnejsie. Ak ma k tomu nejaky dovod (napr. vysledok sa
> uklada do premennej konkretneho typu), tak svoje chovanie moze zmenit -
> to je pripad C. Kedze avr-gcc ma definovanu nativnu sirku slova 16 bit
> tak pripady A a B su spracovane ako 16-bitove (pretoze vysledok sa len
> pouzije pri porovnani, nikde sa neuklada). Ak si ten isty priklad
> vyskusame s x86 gcc, dostaneme sa k 32-bitovym operaciam - co len
> potvrdzuje tuto domnienku
> (Len na okraj: ak v pripade C je premenna ss 32-bitova, cela transakcia
> sa udeje v 32 bitoch aj na AVR... )
>
> Takze skutocnost, ze pripad B bol; prelozeny ako 8-bitovy nema vela
> spolocne s tym, ako vyzera zdrojovy kod, ale co s nim urobili zaverercne
> optimalizacie.
>
> Samozrejme ostava otazka, preco kompilator nezoptimalizoval pripad A.
> Pravdepodobne na zaklade popisu architektury (machine description),
> ktoru dodali autori portu, kompilator nenasiel vhodnu redukciu ... ( v
> pripade A kompilator generuje pseudoinstrukciu tsthi a v pripade B cmphi
> - pre cmphi je zda sa moznost substitucie na bytove operacie, zatial co
> pre tsthi sa jednoducho generuje kod - ale hlbsie skumat sa mi to
> nechce, to som len letmo nahliadol do machine description)
>
> Takze da sa povedat, ze GCC pracuje perfektne a generuje optimalny kod -
> pre take AVR, ake mu zadefinovali autori portu avr-gcc, tj. AVR s
> nativnou sirkou slova 16bit a s takym machine description, ake je. Chova
> sa podla popisu architektury, nie podla nalady. A asi tazko s tym nieco
> urobite - jedine ze by ste vylepsili popis architektury (najdete ho v
> zdrojakoch gcc v adresari gcc/config/avr/avr.md)
>
>
> Len poznamka na zaver:
> Uvedomte si, ze pri vyssich jazykoch je dolezite, ci dostanete vysledok
> podla specifikacie. Vo vasom pripade, ci podmienka funguje tak ako ma.
> To, ako to kompilator prelozi, je jeho vec a - s prepacenim - nic vas do
> toho nie je :). To je proste princip vyssich jazykov. Ak chcete pocitat
> takty a instrukcie - mate assembler. Ono ked vytunite program v C pre
> nejaky kompilator, s novou verziou alebu znackou kompilatora ste zasa na
> zaciatku a o prenositelnosti sa neda hovorit - ale mam dojem, ze to vam
> tu uz niekto povedal.
>
> -m-
Pri prechodu na jiny MCU se aspon teda v mem pripade predpoklada prechod
na vykonnejsi kousek, takze i v pripade minimalnich uprav by nemel byt
vysledek na zpracovani pomalejsi. Prenositelnost bez uprav se opravdu
uvazovat neda, ale kdyz se program dobre napise, je prace s upravami
mnohonasobne mensi nez pri prepisovani assembleru nemluve o chybach,
ktere se pri tom clovek muze dopustit.
Tomas
Další informace o konferenci Hw-list