3.3. Register Conventions¶
Strict conventions associate specific registers with specific operations in the C/C++ environment. If you plan to interface an assembly language routine to a C/C++ program, you must understand and follow these register conventions.
The register conventions dictate how the compiler uses registers and how values are preserved across function calls. Table 1 below shows the types of registers affected by these conventions. Table 2 summarizes how the compiler uses registers and whether their values are preserved across calls. Table 3 and 4 provide register usage information for VFP and Neon registers, respectively. For information about how values are preserved across calls, see Function Structure and Calling Conventions.
Table 1: How Register Types Are Affected by the Conventions
Register Type Description Argument register Passes arguments during a function call Return register Holds the return value from a function call Expression register Holds a value Argument pointer Used as a base value from which a function’s parameters (incoming arguments) are accessed Stack pointer Holds the address of the top of the software stack Link register Contains the return address of a function call Program counter Contains the current address of code being executed
Table 2: Register Usage
Register Alias Usage Preserved by Function (Note 1 below) R0 A1 Argument register, return register, expression register Parent R1 A2 Argument register, return register, expression register Parent R2 A3 Argument register, expression register Parent R3 A4 Argument register, expression register Parent R4 V1 Expression register Child R5 V2 Expression register Child R6 V3 Expression register Child R7 V4, AP Expression register, argument pointer Child R8 V5 Expression register Child R9 V6 Expression register Child R10 V7 Expression register Child R11 V8 Expression register Child R12 V9, 1P Expression register, instruction pointer Parent R13 SP Stack pointer Child (Note 2 below) R14 LR Link register, expression register Child R15 PC Program counter N/A CPSR Current program status register Child SPSR Saved program status register Child
Note 1) The parent function refers to the function making the function call. The child function refers to the function being called.
Note 2) The SP is preserved by the convention that everything pushed on the stack is popped off before returning.
Table 3: VFP Register Usage
32-Bit Register 64-Bit Register Usage Preserved by Function (Note 1 below) FPSCR Status register N/A S0 D0 Floating-point expression, return values, pass arguments N/A S1 S2 D1 Floating-point expression, return values, pass arguments N/A S3 S4 D2 Floating-point expression, return values, pass arguments N/A S5 S6 D3 Floating-point expression, return values, pass arguments N/A S7 S8 D4 Floating-point expression, pass arguments N/A S9 S10 D5 Floating-point expression, pass arguments N/A S11 S12 D6 Floating-point expression, pass arguments N/A S13 S14 D7 Floating-point expression, pass arguments N/A S15 S16 D8 Floating-point expression Child S17 S18 D9 Floating-point expression Child S19 S20 D10 Floating-point expression Child S21 S22 D11 Floating-point expression Child S23 S24 D12 Floating-point expression Child S25 S26 D13 Floating-point expression Child S27 S28 D14 Floating-point expression Child S29 S30 D15 Floating-point expression Child S31 D16-D31 Floating-point expression
Note 1) The child function refers to the function being called.
Table 4: Neon Register Usage
64-Bit Register Quad Register Usage Preserved by Function (Note 1 below) D0 Q0 SIMD register N/A D1 D2 Q1 SIMD register N/A D3 D4 Q2 SIMD register N/A D5 D6 Q3 SIMD register N/A D7 D8 Q4 SIMD register Child D9 D10 Q5 SIMD register Child D11 D12 Q6 SIMD register Child D13 D14 Q7 SIMD register Child D15 D16 Q8 SIMD register N/A D17 D18 Q9 SIMD register N/A D19 D20 Q10 SIMD register N/A D21 D22 Q11 SIMD register N/A D23 D24 Q12 SIMD register N/A D25 D26 Q13 SIMD register N/A D27 D28 Q14 SIMD register N/A D29 D30 Q15 SIMD register N/A D31 FPSCR Status register N/A
Note 1) The child function refers to the function being called.