diff options
Diffstat (limited to 'newlib/libc/machine/powerpc/setjmp.S')
-rw-r--r-- | newlib/libc/machine/powerpc/setjmp.S | 268 |
1 files changed, 0 insertions, 268 deletions
diff --git a/newlib/libc/machine/powerpc/setjmp.S b/newlib/libc/machine/powerpc/setjmp.S deleted file mode 100644 index f327f31da..000000000 --- a/newlib/libc/machine/powerpc/setjmp.S +++ /dev/null @@ -1,268 +0,0 @@ -/* This is a simple version of setjmp and longjmp for the PowerPC. - Ian Lance Taylor, Cygnus Support, 9 Feb 1994. - Modified by Jeff Johnston, Red Hat Inc. 2 Oct 2001. */ - -#include "ppc-asm.h" - -FUNC_START(setjmp) -#ifdef __ALTIVEC__ - addi 3,3,15 # align Altivec to 16 byte boundary - rlwinm 3,3,0,0,27 -#else - addi 3,3,7 # align to 8 byte boundary - rlwinm 3,3,0,0,28 -#endif -#if __SPE__ - /* If we are E500, then save 64-bit registers. */ - evstdd 1,0(3) # offset 0 - evstdd 2,8(3) # offset 8 - evstdd 13,16(3) # offset 16 - evstdd 14,24(3) # offset 24 - evstdd 15,32(3) # offset 32 - evstdd 16,40(3) # offset 40 - evstdd 17,48(3) # offset 48 - evstdd 18,56(3) # offset 56 - evstdd 19,64(3) # offset 64 - evstdd 20,72(3) # offset 72 - evstdd 21,80(3) # offset 80 - evstdd 22,88(3) # offset 88 - evstdd 23,96(3) # offset 96 - evstdd 24,104(3) # offset 104 - evstdd 25,112(3) # offset 112 - evstdd 26,120(3) # offset 120 - evstdd 27,128(3) # offset 128 - evstdd 28,136(3) # offset 136 - evstdd 29,144(3) # offset 144 - evstdd 30,152(3) # offset 152 - evstdd 31,160(3) # offset 160 - - /* Add 164 to r3 to account for the amount of data we just - stored. Note that we are not adding 168 because the next - store instruction uses an offset of 4. */ - addi 3,3,164 -#else - stw 1,0(3) # offset 0 - stwu 2,4(3) # offset 4 - stwu 13,4(3) # offset 8 - stwu 14,4(3) # offset 12 - stwu 15,4(3) # offset 16 - stwu 16,4(3) # offset 20 - stwu 17,4(3) # offset 24 - stwu 18,4(3) # offset 28 - stwu 19,4(3) # offset 32 - stwu 20,4(3) # offset 36 - stwu 21,4(3) # offset 40 - stwu 22,4(3) # offset 44 - stwu 23,4(3) # offset 48 - stwu 24,4(3) # offset 52 - stwu 25,4(3) # offset 56 - stwu 26,4(3) # offset 60 - stwu 27,4(3) # offset 64 - stwu 28,4(3) # offset 68 - stwu 29,4(3) # offset 72 - stwu 30,4(3) # offset 76 - stwu 31,4(3) # offset 80 -#endif - - /* From this point on until the end of this function, add 84 - to the offset shown if __SPE__. This difference comes from - the fact that we save 21 64-bit registers instead of 21 - 32-bit registers above. */ - mflr 4 - stwu 4,4(3) # offset 84 - mfcr 4 - stwu 4,4(3) # offset 88 - # one word pad to get floating point aligned on 8 byte boundary - - /* Check whether we need to save FPRs. Checking __NO_FPRS__ - on its own would be enough for GCC 4.1 and above, but older - compilers only define _SOFT_FLOAT, so check both. */ -#if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT) - stfdu 14,8(3) # offset 96 - stfdu 15,8(3) # offset 104 - stfdu 16,8(3) # offset 112 - stfdu 17,8(3) # offset 120 - stfdu 18,8(3) # offset 128 - stfdu 19,8(3) # offset 136 - stfdu 20,8(3) # offset 144 - stfdu 21,8(3) # offset 152 - stfdu 22,8(3) # offset 160 - stfdu 23,8(3) # offset 168 - stfdu 24,8(3) # offset 176 - stfdu 25,8(3) # offset 184 - stfdu 26,8(3) # offset 192 - stfdu 27,8(3) # offset 200 - stfdu 28,8(3) # offset 208 - stfdu 29,8(3) # offset 216 - stfdu 30,8(3) # offset 224 - stfdu 31,8(3) # offset 232 -#endif - - /* This requires a total of 21 * 4 + 18 * 8 + 4 + 4 + 4 - bytes == 60 * 4 bytes == 240 bytes. */ - -#ifdef __ALTIVEC__ - /* save Altivec vrsave and vr20-vr31 registers */ - mfspr 4,256 # vrsave register - stwu 4,16(3) # offset 248 - addi 3,3,8 - stvx 20,0,3 # offset 256 - addi 3,3,16 - stvx 21,0,3 # offset 272 - addi 3,3,16 - stvx 22,0,3 # offset 288 - addi 3,3,16 - stvx 23,0,3 # offset 304 - addi 3,3,16 - stvx 24,0,3 # offset 320 - addi 3,3,16 - stvx 25,0,3 # offset 336 - addi 3,3,16 - stvx 26,0,3 # offset 352 - addi 3,3,16 - stvx 27,0,3 # offset 368 - addi 3,3,16 - stvx 28,0,3 # offset 384 - addi 3,3,16 - stvx 29,0,3 # offset 400 - addi 3,3,16 - stvx 30,0,3 # offset 416 - addi 3,3,16 - stvx 31,0,3 # offset 432 - - /* This requires a total of 240 + 8 + 8 + 12 * 16 == 448 bytes. */ -#endif - li 3,0 - blr -FUNC_END(setjmp) - - -FUNC_START(longjmp) -#ifdef __ALTIVEC__ - addi 3,3,15 # align Altivec to 16 byte boundary - rlwinm 3,3,0,0,27 -#else - addi 3,3,7 # align to 8 byte boundary - rlwinm 3,3,0,0,28 -#endif -#if __SPE__ - /* If we are E500, then restore 64-bit registers. */ - evldd 1,0(3) # offset 0 - evldd 2,8(3) # offset 8 - evldd 13,16(3) # offset 16 - evldd 14,24(3) # offset 24 - evldd 15,32(3) # offset 32 - evldd 16,40(3) # offset 40 - evldd 17,48(3) # offset 48 - evldd 18,56(3) # offset 56 - evldd 19,64(3) # offset 64 - evldd 20,72(3) # offset 72 - evldd 21,80(3) # offset 80 - evldd 22,88(3) # offset 88 - evldd 23,96(3) # offset 96 - evldd 24,104(3) # offset 104 - evldd 25,112(3) # offset 112 - evldd 26,120(3) # offset 120 - evldd 27,128(3) # offset 128 - evldd 28,136(3) # offset 136 - evldd 29,144(3) # offset 144 - evldd 30,152(3) # offset 152 - evldd 31,160(3) # offset 160 - - /* Add 164 to r3 to account for the amount of data we just - loaded. Note that we are not adding 168 because the next - load instruction uses an offset of 4. */ - addi 3,3,164 -#else - lwz 1,0(3) # offset 0 - lwzu 2,4(3) # offset 4 - lwzu 13,4(3) # offset 8 - lwzu 14,4(3) # offset 12 - lwzu 15,4(3) # offset 16 - lwzu 16,4(3) # offset 20 - lwzu 17,4(3) # offset 24 - lwzu 18,4(3) # offset 28 - lwzu 19,4(3) # offset 32 - lwzu 20,4(3) # offset 36 - lwzu 21,4(3) # offset 40 - lwzu 22,4(3) # offset 44 - lwzu 23,4(3) # offset 48 - lwzu 24,4(3) # offset 52 - lwzu 25,4(3) # offset 56 - lwzu 26,4(3) # offset 60 - lwzu 27,4(3) # offset 64 - lwzu 28,4(3) # offset 68 - lwzu 29,4(3) # offset 72 - lwzu 30,4(3) # offset 76 - lwzu 31,4(3) # offset 80 -#endif - /* From this point on until the end of this function, add 84 - to the offset shown if __SPE__. This difference comes from - the fact that we restore 21 64-bit registers instead of 21 - 32-bit registers above. */ - lwzu 5,4(3) # offset 84 - mtlr 5 - lwzu 5,4(3) # offset 88 - mtcrf 255,5 - # one word pad to get floating point aligned on 8 byte boundary - - /* Check whether we need to restore FPRs. Checking - __NO_FPRS__ on its own would be enough for GCC 4.1 and - above, but older compilers only define _SOFT_FLOAT, so - check both. */ -#if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT) - lfdu 14,8(3) # offset 96 - lfdu 15,8(3) # offset 104 - lfdu 16,8(3) # offset 112 - lfdu 17,8(3) # offset 120 - lfdu 18,8(3) # offset 128 - lfdu 19,8(3) # offset 136 - lfdu 20,8(3) # offset 144 - lfdu 21,8(3) # offset 152 - lfdu 22,8(3) # offset 160 - lfdu 23,8(3) # offset 168 - lfdu 24,8(3) # offset 176 - lfdu 25,8(3) # offset 184 - lfdu 26,8(3) # offset 192 - lfdu 27,8(3) # offset 200 - lfdu 28,8(3) # offset 208 - lfdu 29,8(3) # offset 216 - lfdu 30,8(3) # offset 224 - lfdu 31,8(3) # offset 232 -#endif - -#ifdef __ALTIVEC__ - /* restore Altivec vrsave and v20-v31 registers */ - lwzu 5,16(3) # offset 248 - mtspr 256,5 # vrsave - addi 3,3,8 - lvx 20,0,3 # offset 256 - addi 3,3,16 - lvx 21,0,3 # offset 272 - addi 3,3,16 - lvx 22,0,3 # offset 288 - addi 3,3,16 - lvx 23,0,3 # offset 304 - addi 3,3,16 - lvx 24,0,3 # offset 320 - addi 3,3,16 - lvx 25,0,3 # offset 336 - addi 3,3,16 - lvx 26,0,3 # offset 352 - addi 3,3,16 - lvx 27,0,3 # offset 368 - addi 3,3,16 - lvx 28,0,3 # offset 384 - addi 3,3,16 - lvx 29,0,3 # offset 400 - addi 3,3,16 - lvx 30,0,3 # offset 416 - addi 3,3,16 - lvx 31,0,3 # offset 432 -#endif - - mr. 3,4 - bclr+ 4,2 - li 3,1 - blr -FUNC_END(longjmp) |