diff options
Diffstat (limited to 'ports/sysdeps/arm/setjmp.S')
-rw-r--r-- | ports/sysdeps/arm/setjmp.S | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/ports/sysdeps/arm/setjmp.S b/ports/sysdeps/arm/setjmp.S index c41a1baddd..f750470652 100644 --- a/ports/sysdeps/arm/setjmp.S +++ b/ports/sysdeps/arm/setjmp.S @@ -27,7 +27,8 @@ ENTRY (__sigsetjmp) mov ip, r0 /* Save registers */ - stmia ip!, JMP_BUF_REGLIST + sfi_breg ip, \ + stmia \B!, JMP_BUF_REGLIST #if !defined ARM_ASSUME_NO_IWMMXT || defined __SOFTFP__ # define NEED_HWCAP 1 @@ -64,11 +65,13 @@ ENTRY (__sigsetjmp) Don't use VFP instructions directly because this code is used in non-VFP multilibs. */ /* Following instruction is vstmia ip!, {d8-d15}. */ - stc p11, cr8, [ip], #64 + sfi_breg ip, \ + stc p11, cr8, [\B], #64 /* Store the floating-point status register. */ /* Following instruction is vmrs a4, fpscr. */ mrc p10, 7, a4, cr1, cr0, 0 - str a4, [ip], #4 + sfi_breg ip, \ + str a4, [\B], #4 .Lno_vfp: #ifndef ARM_ASSUME_NO_IWMMXT @@ -77,12 +80,18 @@ ENTRY (__sigsetjmp) /* Save the call-preserved iWMMXt registers. */ /* Following instructions are wstrd wr10, [ip], #8 (etc.) */ - stcl p1, cr10, [r12], #8 - stcl p1, cr11, [r12], #8 - stcl p1, cr12, [r12], #8 - stcl p1, cr13, [r12], #8 - stcl p1, cr14, [r12], #8 - stcl p1, cr15, [r12], #8 + sfi_breg r12, \ + stcl p1, cr10, [\B], #8 + sfi_breg r12, \ + stcl p1, cr11, [\B], #8 + sfi_breg r12, \ + stcl p1, cr12, [\B], #8 + sfi_breg r12, \ + stcl p1, cr13, [\B], #8 + sfi_breg r12, \ + stcl p1, cr14, [\B], #8 + sfi_breg r12, \ + stcl p1, cr15, [\B], #8 .Lno_iwmmxt: #endif |