This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Safe to use r13-r15 as general register?

Note: This was originally posted on 18th July 2011 at http://forums.arm.com

Hello, I am writting a function, which involves complicated algorithm, I want to have a lot of general purpose registers to keep the routine speed. I have read some article that r13-r15 are special registers, but can be used as general purpose registers.

Can I do it like this
   stmfd       sp!, {r4-r15,lr}
:
:
    ldmfd       sp!, {r4-r15,pc}

Thank you very much!
Parents
  • Note: This was originally posted on 23rd July 2011 at http://forums.arm.com


    On ARM, interrupts have a separate banked stack pointer. You don't have to worry about sharing the stack with them and are therefore free to use r13 for anything you want so long as you preserve it before returning.


    That's correct!

    But in this case .save_zone will be the same and then saved datas will be lost at the end of the recursive (or re-entrant call)

    If really you need to manage this case you can use this better (but slower) code


    my_fct:
    push   {r0 - r12, lr}
    movw        r12, #:lower16:.save_zone
    movt        r12, #:upper16:.save_zone
    ldr   r11, [r12], #4
    str   sp, [r12, r11, lsl #2]
    add   r11, #1
    str   r11, [r12, #-4]!

    ...

    movw        r12, #:lower16:.save_zone
    movt        r12, #:upper16:.save_zone
    ldr   r11, [r12], #4
    sub   r11, r11, #1
    ldr   sp, [r12, r11, lsl #2]
    str   r11, [r12, #-4]!
    pop   {r0 - r12, pc}

    .data
    .save_zone:
    .word   0
    .word   0, 0, 0, 0, 0, 0, 0


    Of course you have to test the value of r11 to control the deep of the recursion.

    Etienne
Reply
  • Note: This was originally posted on 23rd July 2011 at http://forums.arm.com


    On ARM, interrupts have a separate banked stack pointer. You don't have to worry about sharing the stack with them and are therefore free to use r13 for anything you want so long as you preserve it before returning.


    That's correct!

    But in this case .save_zone will be the same and then saved datas will be lost at the end of the recursive (or re-entrant call)

    If really you need to manage this case you can use this better (but slower) code


    my_fct:
    push   {r0 - r12, lr}
    movw        r12, #:lower16:.save_zone
    movt        r12, #:upper16:.save_zone
    ldr   r11, [r12], #4
    str   sp, [r12, r11, lsl #2]
    add   r11, #1
    str   r11, [r12, #-4]!

    ...

    movw        r12, #:lower16:.save_zone
    movt        r12, #:upper16:.save_zone
    ldr   r11, [r12], #4
    sub   r11, r11, #1
    ldr   sp, [r12, r11, lsl #2]
    str   r11, [r12, #-4]!
    pop   {r0 - r12, pc}

    .data
    .save_zone:
    .word   0
    .word   0, 0, 0, 0, 0, 0, 0


    Of course you have to test the value of r11 to control the deep of the recursion.

    Etienne
Children
No data