<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div style="margin:0;"><span style="font-size: 16px;">Hi all,</span></div><div style="margin:0;"><br></div><div style="margin:0;"><span style="font-size: 16px;">I'm newbie at GHC, trying to read the source code and understand the design of GHC. </span></div><div style="margin:0;"><span style="font-size: 16px;">Now I'm learning about the Haskell Execution Model, but now I'm a bit confused about the STG-machine Registers.</span></div><div style="margin:0;"><br></div><div style="margin:0;"><span style="font-size: 16px;">First, as shown in the GHC wiki e.g. </span><a href="https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/rts/haskell-execution/registers" _src="https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/rts/haskell-execution/registers" style="font-size: 16px; text-decoration: underline;"><span style="font-size: 16px;">https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/rts/haskell-execution/registers</span></a><span style="font-size: 16px;"> ,</span></div><div style="margin:0;"><span style="font-size: 16px;">the STG-machine has some virtual registers that are mapped to real registers, such as <b>Base, Sp, SpLim, Hp, Rn, Fn and Dn</b>,</span></div><div style="margin:0;"><span style="font-size: 16px;">but unfortunately the mapping logic of the STG registers is not explained in detail here.</span></div><div style="margin:0;"><br></div><div style="margin:0;"><span style="font-size: 16px;">Then I tried to read the source files of various platforms in <span style="font-size: 16px; white-space: pre;"><b>rts/include/stg/MachRegs</b>.</span></span></div><div style="margin:0;"><span style="font-size: 16px;"><span style="font-size: 16px; white-space: pre;">At first I thought they were mapped using <b>the callee saved registers</b>, such as <b>aarch64, ppc, loongarch64 and riscv64</b> platforms,</span></span></div><div style="margin:0;"><span style="white-space: pre; font-size: 16px;">but this seems broken on <b>s390x and x86_64</b> platforms.</span></div><div style="margin:0;"><span style="white-space: pre; font-size: 16px;"><br></span></div><div style="margin:0;"><span style="white-space: pre; font-size: 16px;">so now I have two questions:</span></div><div style="margin:0;"><span style="font-size: 16px;"><span style="font-size: 16px; white-space: pre;">1. What</span> determines the amounts of <b>Rn, Fn and Dn</b> for different platforms? </span></div><div style="margin:0;"><span style="font-size: 16px;">As for Rn, aarch64 has 6 registers, loongarch64 has 5 registers, ppc has 10 registers, and riscv64 has 7 registers.</span></div><div style="margin:0;"><span style="font-size: 16px;">As for Fn, both aarch64 and loongarch64 have 4 registers, and both ppc and riscv64 have 6 registers.</span></div><div style="margin:0;"><br></div><div style="margin:0;"><span style="font-size: 16px;">2. What is the basic rule to assign the actual processor registers to the STG machine registers?</span></div><div style="margin:0;"><span style="font-size: 16px;">The aarch64, loongarch64, ppc and riscv64 platforms seem to have a 'normal' mapping,</span></div><div style="margin:0;"><span style="font-size: 16px;">while the s390x and x86_64 platforms have an 'non-normal' mapping </span><span style="font-size: 16px;">e.g. R4~R8, F5~F6 and D5~D6 in </span><span style="font-size: 16px;">s390x use the caller saved registers.</span></div><div style="margin:0;"><span style="white-space: pre; font-size: 16px;">Does this mean that the caller saved registers for passing argument can be used for mapping when the callee saved registers are insufficient?</span></div><div style="margin:0;"><br></div><div style="margin:0;"><span style="font-size: 16px;">Thanks,</span></div><div style="margin:0;"><span style="font-size: 16px;">Dashiell</span></div></div>