diff options
-rw-r--r-- | libc/sysdeps/linux/arm/__longjmp.S | 8 | ||||
-rw-r--r-- | libc/sysdeps/linux/arm/setjmp.S | 8 |
2 files changed, 16 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/arm/__longjmp.S b/libc/sysdeps/linux/arm/__longjmp.S index 58ae8ab58..a5ffe84e9 100644 --- a/libc/sysdeps/linux/arm/__longjmp.S +++ b/libc/sysdeps/linux/arm/__longjmp.S @@ -64,6 +64,13 @@ __longjmp: #if defined __UCLIBC_HAS_FLOATS__ && ! defined __UCLIBC_HAS_SOFT_FLOAT__ #ifdef __VFP_FP__ +# if __ARM_ARCH >= 8 + /* Restore the VFP registers. */ + fldmiax ip!, {d8-d15} + /* Restore the floating-point status register. */ + ldr r1, [ip], #4 + fmxr fpscr, r1 +# else /* Restore the VFP registers. */ /* Following instruction is fldmiax ip!, {d8-d15}. */ ldc p11, cr8, [r12], #68 @@ -71,6 +78,7 @@ __longjmp: ldr r1, [ip], #4 /* Following instruction is fmxr fpscr, r1. */ mcr p10, 7, r1, cr1, cr0, 0 +# endif # elif defined __MAVERICK__ cfldrd mvd4, [ip], #8 ; nop cfldrd mvd5, [ip], #8 ; nop diff --git a/libc/sysdeps/linux/arm/setjmp.S b/libc/sysdeps/linux/arm/setjmp.S index f7a74cc5a..d5bc9ba65 100644 --- a/libc/sysdeps/linux/arm/setjmp.S +++ b/libc/sysdeps/linux/arm/setjmp.S @@ -54,6 +54,13 @@ __sigsetjmp: #endif #if defined __UCLIBC_HAS_FLOATS__ && ! defined __UCLIBC_HAS_SOFT_FLOAT__ # ifdef __VFP_FP__ +# if __ARM_ARCH >= 8 + /* Store the VFP registers. */ + fstmiax ip!, {d8-d15} + /* Store the floating-point status register. */ + fmrx r2, fpscr + str r2, [ip], #4 +# else /* Store the VFP registers. */ /* Following instruction is fstmiax ip!, {d8-d15}. */ stc p11, cr8, [r12], #68 @@ -61,6 +68,7 @@ __sigsetjmp: /* Following instruction is fmrx r2, fpscr. */ mrc p10, 7, r2, cr1, cr0, 0 str r2, [ip], #4 +# endif # elif defined __MAVERICK__ cfstrd mvd4, [ip], #8 ; nop cfstrd mvd5, [ip], #8 ; nop |