AVRGCC problem z 8 bit wynikiem funkcji (wielkosc kodu)



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?Pawe=B3_Sklarow?= <p_sklarowUSUN_at_nospam_pocztaUSUN.onet.pl>
Subject: AVRGCC problem z 8 bit wynikiem funkcji (wielkosc kodu)
Date: Fri, 07 May 2004 13:15:50 +0200


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.

--
pozdrawiam, Paweł Sklarow

========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "Paweł Kurzawa" <groups_at_nospam_kpw.qs.pl>
Subject: Re: AVRGCC problem z 8 bit wynikiem funkcji (wielkosc kodu)
Date: Fri, 7 May 2004 14:39:39 +0200


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 :((


--

--
Best regards
K_at_nospam_pW from Poland

kpw(at)qs.pl
http://kpw.qs.pl
UIN: 8017753
GG: 1263183
---------------- end ----------------

Użytkownik "Paweł Sklarow" <p_sklarowUSUN_at_nospam_pocztaUSUN.onet.pl> napisał w
wiadomości news:c7fr1d$naj$1_at_nospam_news.onet.pl...
> 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.
>
> --
> pozdrawiam, Paweł Sklarow



========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl>
Subject: Re: AVRGCC problem z 8 bit wynikiem funkcji (wielkosc kodu)
Date: Fri, 7 May 2004 15:25:31 +0200


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

Jak zmusić GCC, zeby nie promowal 8bit wyniku funkcji do inta 16bit?

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.

Druga sprawa: czemu gcc wrzuca niepotrzebne ret'y w funkcjach?

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 :-(

--
Pozdrowienia
Jurek Szczesiul

========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai