[fpc-devel] register allocator seems to be using S20 for two things at the same time (related to armhf porting work)

peter green plugwash at p10link.net
Mon Mar 19 00:44:35 CET 2012

> Then a register is spilled, i.e. replace by a location in memory. This 
> may be possible without new registers:
> mov ireg30d,ireg29d    ->     mov ireg30d,[ebp-40]
> ... but in some cases a help register is needed:
> mov ireg30d,[ebp+20]   ->     mov ireg99d,[ebp+20]
>                               mov [ebp-40],ireg99d
> Should a new register is needed, register allocation is completely 
> restarted with the new code.
Thanks for the info.
>> My current suspiscion is that something is missing regarding handling 
>> of running out of VFP registers and it hasn't been noticed before 
>> because noone has tried to do what i'm doing (implementing a calling 
>> convention using VFP registers and then stress testing it) but i've 
>> no idea where to look in the sourcecode to confirm/refute that idea.
> It doesn't look like spilling happens in your example: I don't see 
> moves from/to the stack frame as temporary location.
My suspiscion was that the compiler was trying to spill but not actually 
generating any code to implement the spill.
> Perhaps the first thing to check is to add a breakpoint in 
> Tinterferencebitmap.setbitmap.
> The "versions" of s20 use superregister 50 and 70, so a setbitmap 
> (50,70) or (70,50) should be called at some point to tell the register 
> allocator both registers are active at the same time and cannot be 
> coalesced.
I added a debug writeln to setbitmap and it does seem to be being called 
with both 50,70 and 70,50. Full output is at http://pastebin.com/3jd8zNkh

More information about the fpc-devel mailing list