This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
dev:crosscompiler:backend_arm:register_allocation [2018/12/21 10:44] – [Parameter Passing] ursgraf | dev:crosscompiler:backend_arm:register_allocation [2019/10/03 10:22] (current) – [Parameter Passing] ursgraf | ||
---|---|---|---|
Line 13: | Line 13: | ||
| R15 | dedicated | PC | | | R15 | dedicated | PC | | ||
| D0 | dedicated| scratch register | | | D0 | dedicated| scratch register | | ||
- | | D1 | volatile | + | | D1 | dedicated| scratch register, return value | |
- | | D2-D6 | volatile | further | + | | D2-D6 | volatile | parameters, local variables | |
| D7-D10 | volatile | local variables | | | D7-D10 | volatile | local variables | | ||
| D11-D31 | nonvolatile | local variables | | | D11-D31 | nonvolatile | local variables | | ||
Line 32: | Line 32: | ||
===== Parameter Passing ===== | ===== Parameter Passing ===== | ||
- | Parameters are passed in R0..R5 and D1..D6.\\ | + | Parameters are passed in R0..R5 and D2..D6.\\ |
- | In the interface // | + | In the interface // |
- | ^S0^S1^S2^S3^S4^S5^S6^S7^S8^S9^ | + | |S0|S1|S2|S3|S4|S5|S6|S7|S8|S9|S10|S11| |
- | ^ | + | | |
- | ^ ^^a^ ^ b ^^c^ ^ d ^^ | + | | ^| ^^a| ^ b ^^c| ^ d ^^ |
+ | |||
+ | If the parameters do not fit into the parameter register, they will be passed on the stack in a special parameter block. Note that the block is filled with parameters of type integer (offset increases with parameter number) first. After this parameters of type float and double are pushed into this block. Parameters of type float and double both occupy 8 bytes. | ||
===== Locals on the Stack ===== | ===== Locals on the Stack ===== | ||
Line 57: | Line 59: | ||
+ | When dividing numbers of type long, a large number of auxiliary registers are necessary. For these cases the register allocation is run with a reduced register set with the same reserved registers as above given above. |