//
 // Note that all currently shipping darwin/arm platforms require
 // cgo and do not support c-shared.
-TEXT _rt0_arm_darwin_lib(SB),NOSPLIT,$12
+TEXT _rt0_arm_darwin_lib(SB),NOSPLIT,$0
+       // R11 is REGTMP, reserved for liblink. It is used below to
+       // move R0/R1 into globals. However in the darwin ARMv7 calling
+       // convention, it is a callee-saved register. So we save it to a
+       // temporary register.
+       MOVW  R11, R2
        MOVW  R0, _rt0_arm_darwin_lib_argc<>(SB)
        MOVW  R1, _rt0_arm_darwin_lib_argv<>(SB)
 
        // Create a new thread to do the runtime initialization and return.
-       MOVW  _cgo_sys_thread_create(SB), R4
-       CMP   $0, R4
+       MOVW  _cgo_sys_thread_create(SB), R3
+       CMP   $0, R3
        B.EQ  nocgo
        MOVW  $_rt0_arm_darwin_lib_go(SB), R0
        MOVW  $0, R1
-       BL    (R4)
+       MOVW  R2, R11
+       BL    (R3)
        RET
 nocgo:
        MOVW  $0x400000, R0
-       MOVW  $_rt0_arm_darwin_lib_go(SB), R1
-       MOVW  $0, R2
-       MOVW  R0,  (R13) // stacksize
-       MOVW  R1, 4(R13) // fn
-       MOVW  R2, 8(R13) // fnarg
-       MOVW  $runtime·newosproc0(SB), R4
-       BL    (R4)
+       MOVW  R0, (R13) // stacksize
+       MOVW  $_rt0_arm_darwin_lib_go(SB), R0
+       MOVW  R0, 4(R13) // fn
+       MOVW  $0, R0
+       MOVW  R0, 8(R13) // fnarg
+       MOVW  $runtime·newosproc0(SB), R3
+       MOVW  R2, R11
+       BL    (R3)
        RET
 
 TEXT _rt0_arm_darwin_lib_go(SB),NOSPLIT,$0