Fix register conflicts and avoid deprecated instructions in ARM EABI setjmp/longjmp.
* 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.
This commit is contained in:
parent
b5c2620bee
commit
fbc4c20a80
|
@ -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>
|
2009-10-22 Julian Brown <julian@codesourcery.com>
|
||||||
|
|
||||||
* sysdeps/arm/elf/start.S (_start): Avoid dependency on PC pipeline
|
* sysdeps/arm/elf/start.S (_start): Avoid dependency on PC pipeline
|
||||||
|
|
|
@ -59,12 +59,12 @@ ENTRY (__longjmp)
|
||||||
beq Lno_vfp
|
beq Lno_vfp
|
||||||
|
|
||||||
/* Restore the VFP registers. */
|
/* Restore the VFP registers. */
|
||||||
/* Following instruction is fldmiax ip!, {d8-d15}. */
|
/* Following instruction is vldmia ip!, {d8-d15}. */
|
||||||
ldc p11, cr8, [r12], #68
|
ldc p11, cr8, [r12], #64
|
||||||
/* Restore the floating-point status register. */
|
/* Restore the floating-point status register. */
|
||||||
ldr r1, [ip], #4
|
ldr a3, [ip], #4
|
||||||
/* Following instruction is fmxr fpscr, r1. */
|
/* Following instruction is fmxr fpscr, a3. */
|
||||||
mcr p10, 7, r1, cr1, cr0, 0
|
mcr p10, 7, a3, cr1, cr0, 0
|
||||||
Lno_vfp:
|
Lno_vfp:
|
||||||
|
|
||||||
tst a2, #HWCAP_ARM_IWMMXT
|
tst a2, #HWCAP_ARM_IWMMXT
|
||||||
|
|
|
@ -52,13 +52,15 @@ ENTRY (__sigsetjmp)
|
||||||
tst a3, #HWCAP_ARM_VFP
|
tst a3, #HWCAP_ARM_VFP
|
||||||
beq Lno_vfp
|
beq Lno_vfp
|
||||||
|
|
||||||
/* Store the VFP registers. */
|
/* Store the VFP registers.
|
||||||
/* Following instruction is fstmiax ip!, {d8-d15}. */
|
Don't use VFP instructions directly because this code
|
||||||
stc p11, cr8, [r12], #68
|
is used in non-VFP multilibs. */
|
||||||
|
/* Following instruction is vstmia ip!, {d8-d15}. */
|
||||||
|
stc p11, cr8, [ip], #64
|
||||||
/* Store the floating-point status register. */
|
/* Store the floating-point status register. */
|
||||||
/* Following instruction is fmrx r2, fpscr. */
|
/* Following instruction is vmrs a4, fpscr. */
|
||||||
mrc p10, 7, r2, cr1, cr0, 0
|
mrc p10, 7, a4, cr1, cr0, 0
|
||||||
str r2, [ip], #4
|
str a4, [ip], #4
|
||||||
Lno_vfp:
|
Lno_vfp:
|
||||||
|
|
||||||
tst a3, #HWCAP_ARM_IWMMXT
|
tst a3, #HWCAP_ARM_IWMMXT
|
||||||
|
|
Loading…
Reference in New Issue