[llvm-dev] Finding scratch register after function call
Michael Stellmann via llvm-dev
llvm-dev at lists.llvm.org
Sun Jul 22 00:58:26 PDT 2018
>It should be possible to get llvm to produce very good code for the Z80...
Yes, I was thinking that too. These techniques didn't exist back then,
so I'm really looking forward to the point where the first regular C
sources can be compiled and see the magic happening in action live :)
------------------------------------------------------------------------
*From:* Bruce Hoult
*Sent:* Sunday, Jul 22, 2018 9:42 AM WEST
*To:* Michael Stellmann
*Cc:* LLVM Developers Mailing List
*Subject:* [llvm-dev] Finding scratch register after function call
> I had a quick look at some reference material this time :-) I also did
> some work on a DEC Rainbow and a Kaypro CP/M luggable a few years
> later. The compilers of the time were just awful!
>
> It should be possible to get llvm to produce very good code for the
> Z80 -- in larger functions probably better than any human would put
> the effort in to achieve. In particular, what the human regards as the
> "same variable" (but a different SSA value) might live in different
> registers at different times.
>
> On Sun, Jul 22, 2018 at 12:26 AM, Michael Stellmann
> <Michael.Stellmann at gmx.net <mailto:Michael.Stellmann at gmx.net>> wrote:
>
> Thanks Bruce,
>
> and elaborately as ever. Again, I'm surprised about your very
> thorough Z80 knowledge when you said you only did little on the
> ZX81 in the eighties :D
>
> OK, understood. I was first thinking about doing something like
> this for small frames:
>
> 1. push bc # 1 byte; 11 cycles - part of call frame-cleanup: save
> scratch register
>
> +-----begin call-related
> 2. ld <rr>,stack-param
> 3. push <rr>
> ... more code to load non-stack params into registers
> 4. call ...
> 5. pop bc # 1 byte ; 10 cycles - call frame cleanup: restore
> stack-pointer (value in BC is not used)
> +-----end call-related
>
> 6. pop bc # part of call frame-cleanup: restore scratch reg's value
>
> The stack cleanup would insert line 5, and have to insert lines 1
> and 6 - summing up to 3 bytes of instructions - and maybe the
> outer two could be eliminated in a late optimization pass, when
> register usage is known.
>
> But then again - looking at your math and the *total* mem and
> cycles, incl. setup and tear-down - convinced me of dropping my
> complex idea with saving "BC" and use it for cleanup or
> sacrificing the calling convention. The complexity just doesn't
> justify the gains. Instead, going for easy-to-implement solutions:
> For small call frames with only 1 or 2 params on the stack, two
> "inc sp" (1 byte, 6 cycles per inst) per parameter can be used,
> and your "big stack frame" suggestion for larger ones.
>
> This also allows keeping a "beneficial" param and return value
> calling convention:
> I want to assign the first 3 (HL + DE + BC - or at least 2)
> function params to registers, so the stack cleanup is only
> required for functions with more than 3 parameters at all - or
> vararg funcs.
> And only functions with more than 5 params will need the "big
> stack frame" cleanup. Those cases are rare (or at least can be
> avoided easily by a developer), or, knowing the mechanics,
> shouldn't be used for time critical inner loops anyway.
> Being able to keep HL for the return value allows very efficient
> nested function calls in the form "Func1(Func2(nnn));", as
> register shuffling can be avoided - the result of Func2 can be
> passed directly Func1.
>
> Thanks for pointing me again to the right direction!
>
> Michael
>
> Oh, and BTW, I'm planning to do the backend primarily for the MSX
> - my first computer in 1984. Just for the fun of it, I started now
> writing a small game for it after 25+ years of absence, and was
> wondering what 30+ years compiler technology would be able to
> achieve on such a simple (but challenging, as in
> "not-alway-straightforward") CPU ;-)
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180722/3da40f97/attachment.html>
More information about the llvm-dev
mailing list