Fix register conflicts and avoid deprecated instructions in ARM EABI setjmp/longjmp.
authorAndrew Stubbs <ams@codesourcery.com>
Thu, 22 Oct 2009 19:35:53 +0000 (19:35 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 22 Oct 2009 19:35:53 +0000 (19:35 +0000)
* setjmp and longjmp were using the obsolete fstmiax and fldmiax
  instructions.

* Because of a confusion with two different sets of names for the same
  registers (r0...r3 and a1...a4), if VFP was present then the
  subsequent check for iWMMXt support would use a register that had
  been clobbered by saving/restoring the VFP registers.  (The bit
  being checked was clobbered by a reserved bit of FPSCR that it
  always 0 on present hardware, and no present hardware has both VFP
  and iWMMXt, so this did not cause visible problems.)

2009-10-22  Andrew Stubbs  <ams@codesourcery.com>
            Julian Brown  <julian@codesourcery.com>

* sysdeps/arm/eabi/setjmp.S (__sigsetjmp): Replace deprecated
instruction fstmiax with vstmia.
Correct register conflict and comment.
* sysdeps/arm/eabi/__longjmp.S (__longjmp): Use vldmia not fldmiax.
Don't clobber r1/a2 register before testing IWMMXT hwcap.

ChangeLog.arm
sysdeps/arm/eabi/__longjmp.S
sysdeps/arm/eabi/setjmp.S

index 643a071..f098f3c 100644 (file)
@@ -1,3 +1,12 @@
+2009-10-22  Andrew Stubbs  <ams@codesourcery.com>
+            Julian Brown  <julian@codesourcery.com>
+
+       * sysdeps/arm/eabi/setjmp.S (__sigsetjmp): Replace deprecated
+       instruction fstmiax with vstmia.
+       Correct register conflict and comment.
+       * sysdeps/arm/eabi/__longjmp.S (__longjmp): Use vldmia not fldmiax.
+       Don't clobber r1/a2 register before testing IWMMXT hwcap.
+
 2009-10-22  Julian Brown  <julian@codesourcery.com>
 
        * sysdeps/arm/elf/start.S (_start): Avoid dependency on PC pipeline
index f283297..3059193 100644 (file)
@@ -59,12 +59,12 @@ ENTRY (__longjmp)
        beq     Lno_vfp
 
        /* Restore the VFP registers.  */
-       /* Following instruction is fldmiax ip!, {d8-d15}.  */
-       ldc     p11, cr8, [r12], #68
+       /* Following instruction is vldmia ip!, {d8-d15}.  */
+       ldc     p11, cr8, [r12], #64
        /* Restore the floating-point status register.  */
-       ldr     r1, [ip], #4
-       /* Following instruction is fmxr fpscr, r1.  */
-       mcr     p10, 7, r1, cr1, cr0, 0
+       ldr     a3, [ip], #4
+       /* Following instruction is fmxr fpscr, a3.  */
+       mcr     p10, 7, a3, cr1, cr0, 0
 Lno_vfp:
 
        tst     a2, #HWCAP_ARM_IWMMXT
index 835db71..92f83af 100644 (file)
@@ -52,13 +52,15 @@ ENTRY (__sigsetjmp)
        tst     a3, #HWCAP_ARM_VFP
        beq     Lno_vfp
 
-       /* Store the VFP registers.  */
-       /* Following instruction is fstmiax ip!, {d8-d15}.  */
-       stc     p11, cr8, [r12], #68
+       /* Store the VFP registers.
+          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
        /* Store the floating-point status register.  */
-       /* Following instruction is fmrx r2, fpscr.  */
-       mrc     p10, 7, r2, cr1, cr0, 0
-       str     r2, [ip], #4
+       /* Following instruction is vmrs a4, fpscr.  */
+       mrc     p10, 7, a4, cr1, cr0, 0
+       str     a4, [ip], #4
 Lno_vfp:
 
        tst     a3, #HWCAP_ARM_IWMMXT