AVRGCC problem z 8 bit wynikiem funkcji (wielkosc kodu)

May 07, 2004 2 Replies

Witam!



Jak zmusić GCC, zeby nie promowal 8bit wyniku funkcji do inta 16bit? Np. mam sobie: uint8_t dummy(void) { return 0; }



Po przełożeniu na asemblera wyglada to tak:



00000d30 <dummy>: d30: 80 e0 ldi r24, 0x00 ; 0 d32: 90 e0 ldi r25, 0x00 ; 0 d34: 08 95 ret

Wszystko piknie, tylko, że ja nie potrzebuje R25 (starszej czesci). Ktos mógłby zapytać co mi to przeszkadza? Mi osobiście nie przeszkadza, ale kod wynikowy niepotrzebnie rośnie (a cienko u mnie z kodem).



Próbowałem już "return (uint8_t)0" żeby nie było.



Zeby bylo weselej to faq mówi: " Function call conventions: (...) Return values: 8-bit in r24 (not r25!), 16-bit in r25:r24, (...) "



Druga sprawa: czemu gcc wrzuca niepotrzebne ret'y w funkcjach? Dzieje się tak w momencie, gdy funkcja ma zwrócić jakąś wartość. Jak się tego pozbyć?



Przykład: uint8_t dummy(uint8_t foo) { if (foo==5) return 0; else return 1; }



jest kompilowany do:



**** uint8_t dummy(uint8_t foo)
**** { /* prologue: frame size=0 *//* prologue end (size=0) */
**** if (foo==5) (...)
**** else
**** return 1;
**** } ret .L32: ldi r24,lo8(1) ldi r25,hi8(1) ret /* epilogue: frame size=0 */ ret <==================== po co ten drugi ret?

Jest to zależne od wersji kompilatora: w 3.2 jest ok, a w 3.3.2 źle.


Ten sam problem istnieje przy switch (x) - case y: porazka tego chyba sie nie przeskaczy jak tylko reczne poprawianie assemblera ... ale jak znajdziesz jakies daj znac na priva prosze. Ja juz sie poddalem z tym problemem :((

Fri, 07 May 2004 13:15:50 +0200, na pl.misc.elektronika, Paweł Sklarow napisał(a):

Avr-gcc bardzo jest uparty z ta promocja - temat nieraz wracal w roznych odmianach. Ale tutaj IMHO ma racje : nigdy nie wiadomo czy gdzies w programie wynik funkcji nie bedzie domyslnie promowany do int - wtedy zadbanie o R25 jest poprawne.

A to juz raczej ewidentna niedorobka - tym bardziej, ze zbedny ret znika jesli troche inaczej napisac funkcje ( np. z posrednia zmienna lokalna ). W 3.4.0 tez jest :-(

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required