about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2003-03-20 22:29:44 +0000
committerAlexandre Oliva <aoliva@redhat.com>2003-03-20 22:29:44 +0000
commitd20152e148cfba15486243d6ad312005e7ab7e32 (patch)
tree75eacf2f7560d8a2ac36df13a4c2be899c3e3754
parent4b5e1c5f0ef986ccf8a67ed44d701dc18f7d7a44 (diff)
downloadglibc-d20152e148cfba15486243d6ad312005e7ab7e32.tar.gz
glibc-d20152e148cfba15486243d6ad312005e7ab7e32.tar.xz
glibc-d20152e148cfba15486243d6ad312005e7ab7e32.zip
* sysdeps/mips/bits/setjmp.h: n32 has only 6 call-saved fpregs. * sysdeps/mips/mips64/setjmp_aux.c (__sigsetjmp_aux): Adjust. * sysdeps/mips/mips64/__longjmp.c (__longjmp): Likewise.
	* sysdeps/mips/bits/setjmp.h: n32 has only 6 call-saved fpregs.
	* sysdeps/mips/mips64/setjmp_aux.c (__sigsetjmp_aux): Adjust.
	* sysdeps/mips/mips64/__longjmp.c (__longjmp): Likewise.
-rw-r--r--ChangeLog4
-rw-r--r--sysdeps/mips/bits/setjmp.h6
-rw-r--r--sysdeps/mips/mips64/__longjmp.c11
-rw-r--r--sysdeps/mips/mips64/setjmp_aux.c9
4 files changed, 26 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 6121a0326b..4e291fba72 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2003-03-20  Alexandre Oliva  <aoliva@redhat.com>
 
+	* sysdeps/mips/bits/setjmp.h: n32 has only 6 call-saved fpregs.
+	* sysdeps/mips/mips64/setjmp_aux.c (__sigsetjmp_aux): Adjust.
+	* sysdeps/mips/mips64/__longjmp.c (__longjmp): Likewise.
+
 	* sysdeps/unix/sysv/linux/mips/pread.c: Don't break up offset
 	into high and low halves on n64.
 	* sysdeps/unix/sysv/linux/mips/pread64.c: Likewise.
diff --git a/sysdeps/mips/bits/setjmp.h b/sysdeps/mips/bits/setjmp.h
index 562c13243c..b2ee3749dd 100644
--- a/sysdeps/mips/bits/setjmp.h
+++ b/sysdeps/mips/bits/setjmp.h
@@ -60,10 +60,10 @@ typedef struct
     int __fpc_csr;
 
     /* Callee-saved floating point registers.  */
-#if _MIPS_SIM == _MIPS_SIM_ABI32
-    double __fpregs[6];
-#else
+#if defined _ABI64 && _MIPS_SIM == _ABI64
     double __fpregs[8];
+#else
+    double __fpregs[6];
 #endif
   } __jmp_buf[1];
 
diff --git a/sysdeps/mips/mips64/__longjmp.c b/sysdeps/mips/mips64/__longjmp.c
index 6523d49d9c..32587d1c87 100644
--- a/sysdeps/mips/mips64/__longjmp.c
+++ b/sysdeps/mips/mips64/__longjmp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1992, 1995, 1997, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1992, 1995, 1997, 2000, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Brendan Kehoe (brendan@zen.org).
 
@@ -38,6 +38,7 @@ __longjmp (env, val_arg)
   register int val asm ("a1");
 
   /* Pull back the floating point callee-saved registers.  */
+#if defined _ABI64 && _MIPS_SIM == _ABI64
   asm volatile ("l.d $f24, %0" : : "m" (env[0].__fpregs[0]));
   asm volatile ("l.d $f25, %0" : : "m" (env[0].__fpregs[1]));
   asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[2]));
@@ -46,6 +47,14 @@ __longjmp (env, val_arg)
   asm volatile ("l.d $f29, %0" : : "m" (env[0].__fpregs[5]));
   asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[6]));
   asm volatile ("l.d $f31, %0" : : "m" (env[0].__fpregs[7]));
+#else
+  asm volatile ("l.d $f20, %0" : : "m" (env[0].__fpregs[0]));
+  asm volatile ("l.d $f22, %0" : : "m" (env[0].__fpregs[1]));
+  asm volatile ("l.d $f24, %0" : : "m" (env[0].__fpregs[2]));
+  asm volatile ("l.d $f26, %0" : : "m" (env[0].__fpregs[3]));
+  asm volatile ("l.d $f28, %0" : : "m" (env[0].__fpregs[4]));
+  asm volatile ("l.d $f30, %0" : : "m" (env[0].__fpregs[5]));
+#endif
 
   /* Get and reconstruct the floating point csr.  */
   asm volatile ("lw $2, %0" : : "m" (env[0].__fpc_csr));
diff --git a/sysdeps/mips/mips64/setjmp_aux.c b/sysdeps/mips/mips64/setjmp_aux.c
index db75a21a30..b55a3c6c11 100644
--- a/sysdeps/mips/mips64/setjmp_aux.c
+++ b/sysdeps/mips/mips64/setjmp_aux.c
@@ -29,6 +29,7 @@ __sigsetjmp_aux (jmp_buf env, int savemask, long long sp, long long fp,
 		 long long gp)
 {
   /* Store the floating point callee-saved registers...  */
+#if defined _ABI64 && _MIPS_SIM == _ABI64
   asm volatile ("s.d $f24, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[0]));
   asm volatile ("s.d $f25, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[1]));
   asm volatile ("s.d $f26, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[2]));
@@ -37,6 +38,14 @@ __sigsetjmp_aux (jmp_buf env, int savemask, long long sp, long long fp,
   asm volatile ("s.d $f29, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[5]));
   asm volatile ("s.d $f30, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[6]));
   asm volatile ("s.d $f31, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[7]));
+#else
+  asm volatile ("s.d $f20, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[0]));
+  asm volatile ("s.d $f22, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[1]));
+  asm volatile ("s.d $f24, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[2]));
+  asm volatile ("s.d $f26, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[3]));
+  asm volatile ("s.d $f28, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[4]));
+  asm volatile ("s.d $f30, %0" : : "m" (env[0].__jmpbuf[0].__fpregs[5]));
+#endif
 
   /* .. and the PC;  */
   asm volatile ("sd $31, %0" : : "m" (env[0].__jmpbuf[0].__pc));