powerpc/setjmp: Improve RTEMS support

For some RTEMS multilibs, the FPU and Altivec units are disabled during
interrupt handling.  Do not save and restore the corresponding registers in
this case.
This commit is contained in:
Sebastian Huber 2022-01-10 09:00:59 +01:00
parent 7f8fa1de4f
commit ebe756e466
1 changed files with 27 additions and 0 deletions

View File

@ -78,6 +78,14 @@ FUNC_START(setjmp)
on its own would be enough for GCC 4.1 and above, but older on its own would be enough for GCC 4.1 and above, but older
compilers only define _SOFT_FLOAT, so check both. */ compilers only define _SOFT_FLOAT, so check both. */
#if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT) #if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT)
#if defined (__rtems__) && !defined (__PPC_CPU_E6500__)
/* For some RTEMS multilibs, the FPU and Altivec units are disabled
during interrupt handling. Do not save and restore the
corresponding registers in this case. */
mfmsr 5
andi. 5,5,0x2000
beq 1f
#endif
stfdu 14,8(3) # offset 96 stfdu 14,8(3) # offset 96
stfdu 15,8(3) # offset 104 stfdu 15,8(3) # offset 104
stfdu 16,8(3) # offset 112 stfdu 16,8(3) # offset 112
@ -96,12 +104,18 @@ FUNC_START(setjmp)
stfdu 29,8(3) # offset 216 stfdu 29,8(3) # offset 216
stfdu 30,8(3) # offset 224 stfdu 30,8(3) # offset 224
stfdu 31,8(3) # offset 232 stfdu 31,8(3) # offset 232
1:
#endif #endif
/* This requires a total of 21 * 4 + 18 * 8 + 4 + 4 + 4 /* This requires a total of 21 * 4 + 18 * 8 + 4 + 4 + 4
bytes == 60 * 4 bytes == 240 bytes. */ bytes == 60 * 4 bytes == 240 bytes. */
#ifdef __ALTIVEC__ #ifdef __ALTIVEC__
#if defined (__rtems__) && !defined (__PPC_CPU_E6500__)
mfmsr 5
andis. 5,5,0x200
beq 1f
#endif
/* save Altivec vrsave and vr20-vr31 registers */ /* save Altivec vrsave and vr20-vr31 registers */
mfspr 4,256 # vrsave register mfspr 4,256 # vrsave register
stwu 4,16(3) # offset 248 stwu 4,16(3) # offset 248
@ -129,6 +143,7 @@ FUNC_START(setjmp)
stvx 30,0,3 # offset 416 stvx 30,0,3 # offset 416
addi 3,3,16 addi 3,3,16
stvx 31,0,3 # offset 432 stvx 31,0,3 # offset 432
1:
/* This requires a total of 240 + 8 + 8 + 12 * 16 == 448 bytes. */ /* This requires a total of 240 + 8 + 8 + 12 * 16 == 448 bytes. */
#endif #endif
@ -211,6 +226,11 @@ FUNC_START(longjmp)
above, but older compilers only define _SOFT_FLOAT, so above, but older compilers only define _SOFT_FLOAT, so
check both. */ check both. */
#if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT) #if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT)
#if defined (__rtems__) && !defined (__PPC_CPU_E6500__)
mfmsr 5
andi. 5,5,0x2000
beq 1f
#endif
lfdu 14,8(3) # offset 96 lfdu 14,8(3) # offset 96
lfdu 15,8(3) # offset 104 lfdu 15,8(3) # offset 104
lfdu 16,8(3) # offset 112 lfdu 16,8(3) # offset 112
@ -229,9 +249,15 @@ FUNC_START(longjmp)
lfdu 29,8(3) # offset 216 lfdu 29,8(3) # offset 216
lfdu 30,8(3) # offset 224 lfdu 30,8(3) # offset 224
lfdu 31,8(3) # offset 232 lfdu 31,8(3) # offset 232
1:
#endif #endif
#ifdef __ALTIVEC__ #ifdef __ALTIVEC__
#if defined (__rtems__) && !defined (__PPC_CPU_E6500__)
mfmsr 5
andis. 5,5,0x200
beq 1f
#endif
/* restore Altivec vrsave and v20-v31 registers */ /* restore Altivec vrsave and v20-v31 registers */
lwzu 5,16(3) # offset 248 lwzu 5,16(3) # offset 248
mtspr 256,5 # vrsave mtspr 256,5 # vrsave
@ -259,6 +285,7 @@ FUNC_START(longjmp)
lvx 30,0,3 # offset 416 lvx 30,0,3 # offset 416
addi 3,3,16 addi 3,3,16
lvx 31,0,3 # offset 432 lvx 31,0,3 # offset 432
1:
#endif #endif
mr. 3,4 mr. 3,4