From 0175558aa0a16a647ee368898a83a7d42e2011e8 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 14 May 2013 19:50:14 +0000 Subject: Stop ARM setjmp/longjmp saving/restoring fpscr (bug 14908). --- ports/ChangeLog.arm | 8 ++++++++ ports/sysdeps/arm/__longjmp.S | 5 ----- ports/sysdeps/arm/bits/setjmp.h | 6 +++--- ports/sysdeps/arm/setjmp.S | 5 ----- 4 files changed, 11 insertions(+), 13 deletions(-) (limited to 'ports') diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index 2565518c5e..ce5fc360b1 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,3 +1,11 @@ +2013-05-14 Joseph Myers + + [BZ #14908] + * sysdeps/arm/setjmp.S (__sigsetjmp): Don't save fpscr. + * sysdeps/arm/__longjmp.S (__longjmp): Don't restore fpscr. + * sysdeps/arm/bits/setjmp.h (__jmp_buf): Don't mention fpscr in + comment. + 2013-05-13 Roland McGrath * sysdeps/arm/armv7/multiarch/memcpy.S [__ARM_NEON__]: Don't define diff --git a/ports/sysdeps/arm/__longjmp.S b/ports/sysdeps/arm/__longjmp.S index 8de9fa1c7b..a5edede16d 100644 --- a/ports/sysdeps/arm/__longjmp.S +++ b/ports/sysdeps/arm/__longjmp.S @@ -83,11 +83,6 @@ ENTRY (__longjmp) /* Following instruction is vldmia ip!, {d8-d15}. */ sfi_breg r12, \ ldc p11, cr8, [\B], #64 - /* Restore the floating-point status register. */ - sfi_breg ip, \ - ldr a3, [\B], #4 - /* Following instruction is fmxr fpscr, a3. */ - mcr p10, 7, a3, cr1, cr0, 0 .Lno_vfp: #ifndef ARM_ASSUME_NO_IWMMXT diff --git a/ports/sysdeps/arm/bits/setjmp.h b/ports/sysdeps/arm/bits/setjmp.h index 21bbf7f57d..c8c3a9a324 100644 --- a/ports/sysdeps/arm/bits/setjmp.h +++ b/ports/sysdeps/arm/bits/setjmp.h @@ -28,9 +28,9 @@ /* The exact set of registers saved may depend on the particular core in use, as some coprocessor registers may need to be saved. The C Library ABI requires that the buffer be 8-byte aligned, and - recommends that the buffer contain 64 words. The first 28 words - are occupied by v1-v6, sl, fp, sp, pc, d8-d15, and fpscr. (Note - that d8-15 require 17 words, due to the use of fstmx.) */ + recommends that the buffer contain 64 words. The first 27 words + are occupied by v1-v6, sl, fp, sp, pc, and d8-d15. (Note that + d8-15 require 17 words, due to the use of fstmx.) */ typedef int __jmp_buf[64] __attribute__((__aligned__ (8))); #endif diff --git a/ports/sysdeps/arm/setjmp.S b/ports/sysdeps/arm/setjmp.S index f750470652..a6c161db54 100644 --- a/ports/sysdeps/arm/setjmp.S +++ b/ports/sysdeps/arm/setjmp.S @@ -67,11 +67,6 @@ ENTRY (__sigsetjmp) /* Following instruction is vstmia ip!, {d8-d15}. */ 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 - sfi_breg ip, \ - str a4, [\B], #4 .Lno_vfp: #ifndef ARM_ASSUME_NO_IWMMXT -- cgit 1.4.1