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.