diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-11-07 14:33:42 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2022-11-10 16:05:17 +0100 |
commit | 5c79aa4b22df09b6fb3e97538fee7f108f9fd768 (patch) | |
tree | 3b35030087ed5bf3c63da913042dbf995783b47f /newlib | |
parent | 59b8ee7d7066b9a3f39e1c765d0cecb5d9bc07fd (diff) | |
download | newlib-5c79aa4b22df09b6fb3e97538fee7f108f9fd768.zip newlib-5c79aa4b22df09b6fb3e97538fee7f108f9fd768.tar.gz newlib-5c79aa4b22df09b6fb3e97538fee7f108f9fd768.tar.bz2 |
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.
Diffstat (limited to 'newlib')
-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 3a6fa4a..c7af5b1 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 |