RTV forum PL | NewsGroups PL

Jak ograniczyć GCC do zwracania tylko 8-bitowych wartości w AVRGCC?

AVRGCC problem z 8 bit wynikiem funkcji (wielkosc kodu)

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak ograniczyć GCC do zwracania tylko 8-bitowych wartości w AVRGCC?

Paweł Sklarow
Guest

Fri May 07, 2004 10:15 am   



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

Paweł Kurzawa
Guest

Fri May 07, 2004 11:39 am   



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


--

--
Best regards
K@pW from Poland

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

Użytkownik "Paweł Sklarow" <p_sklarowUSUN@pocztaUSUN.onet.pl> napisał w
wiadomości news:c7fr1d$naj$1@news.onet.pl...
Quote:
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


Jurek Szczesiul
Guest

Fri May 07, 2004 12:25 pm   



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

Quote:
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.

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

elektroda NewsGroups Forum Index - Elektronika Polska - Jak ograniczyć GCC do zwracania tylko 8-bitowych wartości w AVRGCC?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map