summaryrefslogtreecommitdiffstats
path: root/newlib/libc/machine/powerpc/setjmp.S
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2002-04-19 19:16:22 +0000
committerJeff Johnston <jjohnstn@redhat.com>2002-04-19 19:16:22 +0000
commit0d844014bfbcab4e48718b787c268d052f773197 (patch)
tree30f19160e87bedae028d33a2839bf51a7b10bac6 /newlib/libc/machine/powerpc/setjmp.S
parentd413aadcafc1fc287fa01cb28dd04f495111e418 (diff)
downloadcygnal-0d844014bfbcab4e48718b787c268d052f773197.tar.gz
cygnal-0d844014bfbcab4e48718b787c268d052f773197.tar.bz2
cygnal-0d844014bfbcab4e48718b787c268d052f773197.zip
2002-04-19 Jeff Johnston <jjohnstn@redhat.com>
* configure.host: Add support for powerpc-eabialtivec*. * libc/include/malloc.h: Add include of <machine/malloc.h>. * libc/include/stdlib.h: Add include of <machine/stdlib.h>. * libc/include/machine/malloc.h: New file. * libc/include/machine/stdlib.h: Ditto. * libc/include/machine/setjmp.h: Add support for powerpc altivec. * libc/machine/powerpc/Makefile.am: Add conditional objects and sources based on configuration. * libc/machine/powerpc/Makefile.in: Regenerated. * libc/machine/powerpc/configure: Ditto. * libc/machine/powerpc/configure.in: Add check for powerpc-eabialtivec* in which case add in additional source files. * libc/machine/powerpc/setjmp.S: Add altivec support. * libc/machine/powerpc/vec_calloc.c: New file. * libc/machine/powerpc/vec_free.c: Ditto. * libc/machine/powerpc/vec_malloc.c: Ditto. * libc/machine/powerpc/vec_mallocr.c: Ditto. * libc/machine/powerpc/vec_realloc.c: Ditto. * libc/machine/powerpc/machine/malloc.h: Ditto. * libc/machine/powerpc/machine/stdlib.h: Ditto. * libc/machine/powerpc/vfprintf.c: New file that is vfprintf.c with added altivec format specifiers. * libc/machine/powerpc/vfscanf.c: New file that is vfscanf.c with added altivec format specifiers.
Diffstat (limited to 'newlib/libc/machine/powerpc/setjmp.S')
-rw-r--r--newlib/libc/machine/powerpc/setjmp.S74
1 files changed, 73 insertions, 1 deletions
diff --git a/newlib/libc/machine/powerpc/setjmp.S b/newlib/libc/machine/powerpc/setjmp.S
index c1376912f..ec3a443d7 100644
--- a/newlib/libc/machine/powerpc/setjmp.S
+++ b/newlib/libc/machine/powerpc/setjmp.S
@@ -1,11 +1,17 @@
/* This is a simple version of setjmp and longjmp for the PowerPC.
- Ian Lance Taylor, Cygnus Support, 9 Feb 1994. */
+ 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
stw 1,0(3) # offset 0
stwu 2,4(3) # offset 4
stwu 13,4(3) # offset 8
@@ -56,14 +62,50 @@ FUNC_START(setjmp)
/* 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
lwz 1,0(3) # offset 0
lwzu 2,4(3) # offset 4
lwzu 13,4(3) # offset 8
@@ -111,6 +153,36 @@ FUNC_START(longjmp)
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