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/11/21 10:48] – ursgraf | dev:crosscompiler:backend_arm:register_allocation [2019/10/03 10:22] (current) – [Parameter Passing] ursgraf | ||
---|---|---|---|
Line 3: | Line 3: | ||
===== Register Usage ===== | ===== Register Usage ===== | ||
- | Registers can be classified as // | ||
| Register | State | Use | | | Register | State | Use | | ||
- | | R0 | volatile | 1st. parameter, return value | | + | | R0 | volatile | 1st. parameter, local variables, return value | |
- | | R1 | volatile | 2nd. parameter, return value (if long, lower 4 bytes of long) | | + | | R1 | volatile | 2nd. parameter, local variables, return value (if long, lower 4 bytes of long) | |
| R2-R5 | volatile | further parameters, local variables | | | R2-R5 | volatile | further parameters, local variables | | ||
| R6 | dedicated | scratch register | | | R6 | dedicated | scratch register | | ||
Line 13: | Line 12: | ||
| R14 | dedicated | link register, scratch register | | | R14 | dedicated | link register, scratch register | | ||
| R15 | dedicated | PC | | | R15 | dedicated | PC | | ||
- | | D0 | volatile | + | | D0 | dedicated| scratch register | |
- | | D1-D6 | volatile | further | + | | D1 | dedicated| scratch register, return value | |
+ | | 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 | | ||
- | | S0 | volatile | 1. parameter, return value | | + | | S0,S1 | dedicated| scratch register | |
- | | S1-S6 | volatile | further parameters | | + | | S2 | volatile | 1. parameter, local variables, return value | |
- | | S7-D21 | volatile | local variables | | + | | S3-S13 | volatile | further parameters, local variables |
+ | | S14-S21 | volatile | local variables | | ||
| S22-S31 | nonvolatile | local variables | | | S22-S31 | nonvolatile | local variables | | ||
Line 30: | Line 31: | ||
For the translation of certain SSA instructions (e.g. of type long) further auxiliary registers are needed. They are assigned and reserved by the register allocator as well. | For the translation of certain SSA instructions (e.g. of type long) further auxiliary registers are needed. They are assigned and reserved by the register allocator as well. | ||
- | ==== Parameter Passing ==== | + | ===== Parameter Passing |
- | Parameters are passes | + | Parameters are passed |
- | In the interface //armPPC/ | + | In the interface //arm/ |
+ | |S0|S1|S2|S3|S4|S5|S6|S7|S8|S9|S10|S11| | ||
+ | | D0 || D1 || D2 || D3 || D4 || D5 || | ||
+ | | ^| ^^a| ^ b ^^c| ^ d ^^ | ||
- | ==== Locals on the Stack ==== | + | 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 ===== | ||
Most SSA instruction have 2 operands and a result. Each of them can reside on the stack. Operands must be fetched into a free register, the result must be stored onto the stack. A single SSA instruction '' | Most SSA instruction have 2 operands and a result. Each of them can reside on the stack. Operands must be fetched into a free register, the result must be stored onto the stack. A single SSA instruction '' | ||
Line 45: | Line 51: | ||
| R4 | dedicated | long part of first operand of SSA instruction | | | R4 | dedicated | long part of first operand of SSA instruction | | ||
| R3 | dedicated | long part of second operand of SSA instruction | | | R3 | dedicated | long part of second operand of SSA instruction | | ||
+ | | D11 | dedicated | result register or third operand of '' | ||
+ | | D12 | dedicated | first operand of SSA instruction | | ||
+ | | D13 | dedicated | second operand of SSA instruction | | ||
+ | | S22 | dedicated | result register or third operand of '' | ||
+ | | S23 | dedicated | first operand of SSA instruction | | ||
+ | | S24 | dedicated | second operand of SSA instruction | | ||
+ | |||
- | For floats and doubles: reserve | + | When dividing numbers of type long, a large number of auxiliary registers are necessary. |