diff options
Diffstat (limited to 'ports/sysdeps/unix/sysv/linux/arm/getcontext.S')
-rw-r--r-- | ports/sysdeps/unix/sysv/linux/arm/getcontext.S | 78 |
1 files changed, 40 insertions, 38 deletions
diff --git a/ports/sysdeps/unix/sysv/linux/arm/getcontext.S b/ports/sysdeps/unix/sysv/linux/arm/getcontext.S index 116d6e8f35..2281c9eff2 100644 --- a/ports/sysdeps/unix/sysv/linux/arm/getcontext.S +++ b/ports/sysdeps/unix/sysv/linux/arm/getcontext.S @@ -41,54 +41,56 @@ ENTRY(__getcontext) /* Save ucontext_t * across the next call. */ mov r4, r0 - + /* __sigprocmask(SIG_BLOCK, NULL, &(ucontext->uc_sigmask)) */ mov r0, #SIG_BLOCK mov r1, #0 add r2, r4, #UCONTEXT_SIGMASK bl PLTJMP(__sigprocmask) - + /* Store FP regs. Much of the FP code is copied from arm/setjmp.S. */ #ifdef PIC - ldr r2, 1f - ldr r1, Lrtld_global_ro + ldr r2, 1f + ldr r1, .Lrtld_global_ro 0: add r2, pc, r2 - ldr r2, [r2, r1] - ldr r2, [r2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] + ldr r2, [r2, r1] + ldr r2, [r2, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET] #else - ldr r2, Lhwcap - ldr r2, [r2, #0] + ldr r2, .Lhwcap + ldr r2, [r2, #0] #endif add r0, r4, #UCONTEXT_REGSPACE - tst r2, #HWCAP_ARM_VFP - beq Lno_vfp - - /* Store the VFP registers. - Don't use VFP instructions directly because this code - is used in non-VFP multilibs. */ - /* Following instruction is vstmia r0!, {d8-d15}. */ - stc p11, cr8, [r0], #64 - /* Store the floating-point status register. */ - /* Following instruction is vmrs r1, fpscr. */ - mrc p10, 7, r1, cr1, cr0, 0 - str r1, [r0], #4 -Lno_vfp: - - tst r2, #HWCAP_ARM_IWMMXT - beq Lno_iwmmxt - - /* Save the call-preserved iWMMXt registers. */ - /* Following instructions are wstrd wr10, [r0], #8 (etc.) */ - stcl p1, cr10, [r0], #8 - stcl p1, cr11, [r0], #8 - stcl p1, cr12, [r0], #8 - stcl p1, cr13, [r0], #8 - stcl p1, cr14, [r0], #8 - stcl p1, cr15, [r0], #8 -Lno_iwmmxt: +#ifdef __SOFTFP__ + tst r2, #HWCAP_ARM_VFP + beq .Lno_vfp +#endif + + /* Store the VFP registers. + Don't use VFP instructions directly because this code + is used in non-VFP multilibs. */ + /* Following instruction is vstmia r0!, {d8-d15}. */ + stc p11, cr8, [r0], #64 + /* Store the floating-point status register. */ + /* Following instruction is vmrs r1, fpscr. */ + mrc p10, 7, r1, cr1, cr0, 0 + str r1, [r0], #4 +.Lno_vfp: + + tst r2, #HWCAP_ARM_IWMMXT + beq .Lno_iwmmxt + + /* Save the call-preserved iWMMXt registers. */ + /* Following instructions are wstrd wr10, [r0], #8 (etc.) */ + stcl p1, cr10, [r0], #8 + stcl p1, cr11, [r0], #8 + stcl p1, cr12, [r0], #8 + stcl p1, cr13, [r0], #8 + stcl p1, cr14, [r0], #8 + stcl p1, cr15, [r0], #8 +.Lno_iwmmxt: /* Restore the clobbered R4 and LR. */ ldr r14, [r4, #MCONTEXT_ARM_LR] @@ -102,11 +104,11 @@ END(__getcontext) #ifdef PIC 1: .long _GLOBAL_OFFSET_TABLE_ - 0b - 8 -Lrtld_global_ro: - .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) +.Lrtld_global_ro: + .long C_SYMBOL_NAME(_rtld_global_ro)(GOT) #else -Lhwcap: - .long C_SYMBOL_NAME(_dl_hwcap) +.Lhwcap: + .long C_SYMBOL_NAME(_dl_hwcap) #endif |