diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-11-07 16:33:42 +0300 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-11-10 18:05:17 +0300 |
commit | 5c79aa4b22df09b6fb3e97538fee7f108f9fd768 (patch) | |
tree | 3b35030087ed5bf3c63da913042dbf995783b47f | |
parent | 59b8ee7d7066b9a3f39e1c765d0cecb5d9bc07fd (diff) |
powerpc/setjmp: Fix 64-bit buffer alignment
The rlwinm is a word-size instruction which clears the remaining 32 bits of a
64-bit register. Use clrrdi in 64-bit configurations.
-rw-r--r-- | newlib/libc/machine/powerpc/setjmp.S | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/newlib/libc/machine/powerpc/setjmp.S b/newlib/libc/machine/powerpc/setjmp.S index 3a6fa4a58..c7af5b105 100644 --- a/newlib/libc/machine/powerpc/setjmp.S +++ b/newlib/libc/machine/powerpc/setjmp.S @@ -8,11 +8,19 @@ FUNC_START(setjmp) #ifdef __ALTIVEC__ addi 3,3,15 # align Altivec to 16 byte boundary +#if __powerpc64__ + clrrdi 3,3,4 +#else rlwinm 3,3,0,0,27 +#endif #else addi 3,3,7 # align to 8 byte boundary +#if __powerpc64__ + clrrdi 3,3,3 +#else rlwinm 3,3,0,0,28 #endif +#endif #if __SPE__ /* If we are E500, then save 64-bit registers. */ evstdd 1,0(3) # offset 0 @@ -193,11 +201,19 @@ FUNC_END(setjmp) FUNC_START(longjmp) #ifdef __ALTIVEC__ addi 3,3,15 # align Altivec to 16 byte boundary +#if __powerpc64__ + clrrdi 3,3,4 +#else rlwinm 3,3,0,0,27 +#endif #else addi 3,3,7 # align to 8 byte boundary +#if __powerpc64__ + clrrdi 3,3,3 +#else rlwinm 3,3,0,0,28 #endif +#endif #if __SPE__ /* If we are E500, then restore 64-bit registers. */ evldd 1,0(3) # offset 0 |