|
From: | Erik Walthinsen |
Subject: | Re: [avr-gcc-list] Missing compiler optimizations? |
Date: | Mon, 23 Jan 2006 11:47:08 -0800 |
User-agent: | Debian Thunderbird 1.0.7 (X11/20051017) |
Nigel Winterbottom wrote:
That's true, but the compiler could use the high registers and save them with the same or slightly more push/pops around the called functions, and gain the ability to use the various instructions that only operate on high registers. Perhaps that's too large of a scale of optimization though, as it depends on number and position of calls, and overall register usage (e.g. some of the function-clobbered registers are only needed *before* the calls, etc.).Watch out. Registers (r18-r27, r30-r31) ARE trashable by any function. Because you call "bootloader_eeprom_read_byte", that too is allowed to trash these registers. You cannot use (r18-r27, r30-r31) for variables which "live" across a function call, unless of course you "push/pop" around that function call.
No, I said "caller", not "called". r28/r29 are the only registers that the "called" function are required to save (of the top 4 pairs).Incorrect. Only Y (r28/r29) is saved.
Try this macro: #define HILOTO16(hi, lo) ({ \ unsigned int __result; \ __asm__ ( " mov %B0,%1 \n" : "=r" (__result) : "r" (hi), "0" (lo) ); \ __result; }) e.g. w = HILOTO16(c, b); This gives optimal code and should cause a different compiler to complain,
> thereby highlighting the non portability.Yeah, I can do that kind of stuff, but it's not really the point. Merging bytes into a word is one of quite a number of common programming idioms (esp. embedded) that I've seen gcc make hash of, so I want to see if there's a way to peephole match more of them and inject better code.
[Prev in Thread] | Current Thread | [Next in Thread] |